Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

sap在此题也不太高效,贴一下很挫的代码

Posted by mountainhigh at 2011-04-10 10:22:55 on Problem 1273
#include<iostream>
#include<climits>
#include<cstring>
const int maxn=400,maxm=400;
const int int_max=10000001;
using namespace std;
int dist[maxn+1],count_dist[maxn+1],his[maxn+1],pre[maxn+6];
int top;
int n,m;
struct node
{
	int data,weight;
	node *next,*anti;
}*retrack[maxn+1],*current[maxn+1],*path[maxn+1],data[maxn*2+5];
node*add_edge(int a,int b,int w)
{
	node*p=&data[++top];
	p->data=b;
	p->weight=w;
	p->next=retrack[a];
	retrack[a]=p;
	return p;
}
void ins_edge(int a,int b,int w)
{
	node*p1=add_edge(a,b,w),*p2=add_edge(b,a,0);
	p1->anti=p2;
	p2->anti=p1;
}
int max_flow(int s,int t)
{
	int i,now_flow,total,min_dist;
	node *p,*locate;
	bool flag;
	memset(count_dist,0,sizeof(count_dist));
	memset(dist,0,sizeof(dist));
	count_dist[0]=m;
	for(i=1;i<=m;i++)
	    current[i]=retrack[i];
	for(total=0,now_flow=int_max,i=s;dist[s]<m;)
	{
		his[i]=now_flow;
		for(flag=false,p=current[i];p!=NULL;p=p->next)
			if((p->weight>0)&&(dist[i]==dist[p->data]+1))
			{
				if(p->weight<now_flow)  now_flow=p->weight;
				pre[p->data]=i;
				path[p->data]=p;
				current[i]=p;
				i=p->data;
				if(t==i)
				{
					for(total+=now_flow;i!=s;i=pre[i])
					{
						path[i]->weight-=now_flow;
						path[i]->anti->weight+=now_flow;
					}
					now_flow=int_max;
				}
				flag=true;break;
			}
			if(!flag)
			{
			    for(min_dist=m-1,p=retrack[i];p!=NULL;p=p->next)
				if((p->weight>0)&&(dist[p->data]<min_dist))
				{
					min_dist=dist[p->data];
					locate=p;
				}
				/*if(p==NULL)
				{
					min_dist=m-1;
				}*/
				current[i]=locate;
				count_dist[dist[i]]--;
				if(count_dist[dist[i]]==0)break;
				dist[i]=min_dist+1;
				count_dist[dist[i]]++;
				if(i!=s)
				{
					i=pre[i];
					now_flow=his[i];
				}
	     	}
	}
	return total;
}
int main()
{
	int i,si,ei,ci;
	while(~scanf("%d%d",&n,&m))
	{
		top=0;
	    for(i=1;i<=200;i++)
	       retrack[i]=NULL;
	    for(i=1;i<=n;i++)
	    {
		    scanf("%d%d%d",&si,&ei,&ci);
		    ins_edge(si,ei,ci);
	    }
	    printf("%d\n",max_flow(1,m));
	}
	return 0;
}
	

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator