首页 > 代码库 > HDU 3549 Flow Problem
HDU 3549 Flow Problem
题意:还是最大流的算法,n是给定的点,m是边,以下m行是每条边
思路:还是EK算法,我目前就只知道这个算法,用C++交4000多MS,大家感兴趣的还是别用这个算法了!我的代码下面附了一个多路增广代码,可以借鉴,78MS
我的AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; #define INF 100000000 #define N 1000 int cap[N][N],flow[N][N]; int p[N],a[N]; int m,t; int Edmonds_Karp(int s) { int f=0; queue<int >q; while(1) { memset(a,0,sizeof(a)); a[s]=INF; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); for(int v=1;v<=t;v++) if(!a[v]&&cap[u][v]>flow[u][v]) { p[v]=u; q.push(v); a[v]=min(a[u],cap[u][v]-flow[u][v]); } } if(a[t]==0)break; for(int u=t;u!=s;u=p[u]) { flow[p[u]][u]+=a[t]; flow[u][p[u]]-=a[t]; } f+=a[t]; } return f; } int main() { int u,v,w,i,j,n,cnt=1; scanf("%d",&n); while(n--) { scanf("%d %d",&t,&m); memset(cap,0,sizeof(cap)); memset(flow,0,sizeof(flow)); for(i=0;i<m;i++) { scanf("%d %d %d",&u,&v,&w); cap[u][v]+=w; } printf("Case %d: %d\n",cnt++,Edmonds_Karp(1)); } return 0; }
多路增广:
#include <cstdio> #include <string.h> #include <algorithm> using namespace std; const int NMax=5000; struct edge { int num,len; edge *next,*rev; }*S[NMax],pool[NMax]; int N,M,level[NMax],Q[NMax]; bool makelevel() { memset(level,-1,sizeof(level)); int tmp; Q[0]=1; level[1]=0; for(int i=0,bot=1;i<bot;i++) { tmp=Q[i]; for(edge *p=S[tmp];p;p=p->next) if(p->len>0 && level[p->num]==-1) level[Q[bot++]=p->num]=level[tmp]+1; } return level[N]!=-1; } int DFS(int a,int alpha) { if(a==N) return alpha; int tot=0,tmp; for(edge *p=S[a];p && tot<alpha;p=p->next) { if(p->len>0 && level[p->num]==level[a]+1) { if(tmp=DFS(p->num,min(alpha-tot,p->len))) { tot+=tmp; p->len-=tmp; if(p->rev) p->rev->len+=tmp; } } } if(!tot) level[a]=-1; return tot; } int main() { int x,y,z,L,tmp; int T; scanf("%d",&T); for(int I=1;I<=T;I++) { scanf("%d%d",&N,&M); L=0; memset(S,0,sizeof(S)); for(int i=1;i<=M;i++) { scanf("%d%d%d",&x,&y,&z); edge *p=&pool[L++],*q=&pool[L++]; p->num=y; p->len=z; p->next=S[x]; q->num=x; q->len=0; q->next=S[y]; p->rev=q; q->rev=p; S[x]=p; S[y]=q; } int ans=0; while(makelevel()) while(tmp=DFS(1,(~0u>>1))) ans+=tmp; printf("Case %d: %d\n",I,ans); } getchar(); getchar(); return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。