poj 1273 最大流
终于尝试了网络流,看了两天的网络流,稍微有点头绪,做了第一道网络流的题感觉还不错。在这过程中让我最苦恼的还是用邻接表的存储结构,现在还是初步了解就不做总结吧。
#include<iostream> #include<queue> #include<cstring> using namespace std; #define MAX_INT 1234567890 struct node { int v; int value; int opposite; int next; }; node edge[2001]; int head[201],pre[201],flow[201],st[201],N; queue <int> Q; int bfs(int s,int t) { int e,j; memset(flow,0,sizeof(flow)); memset(pre,0,sizeof(pre)); while(!Q.empty()) Q.pop(); flow[s]=MAX_INT; Q.push(s); while(!Q.empty()) { e=Q.front(),Q.pop(); if(e==t) break; for(j=head[e];j;j=edge[j].next) { if(!pre[edge[j].v] && edge[j].value>0) { flow[edge[j].v]=(flow[e]<edge[j].value)? flow[e] : edge[j].value; pre[edge[j].v]=j; st[edge[j].v]=e; Q.push(edge[j].v); } } } return flow[t]; } int Ford_Fulkerson(int s,int t) { int j,k,w,max_flow=0; while(w=bfs(s,t)) { max_flow+=w; for(k=t;k!=1;k=st[k]) { edge[pre[k]].value-=w; j=edge[pre[k]].opposite; edge[j].value+=w; } } return max_flow; } int add(int s,int t,int w) { edge[N].v=t; edge[N].value=w; edge[N].next=head[s]; return N++; } int main() { int i,m,n,s,t,w; while(cin>>m>>n) { memset(head,0,sizeof(head)); for(N=1,i=0;i<m;i++) { cin>>s>>t>>w; head[s]=add(s,t,w); head[t]=add(t,s,0); edge[head[s]].opposite=head[t]; edge[head[t]].opposite=head[s]; } cout<<Ford_Fulkerson(1,n)<<endl; } return 0; }