终于尝试了网络流,看了两天的网络流,稍微有点头绪,做了第一道网络流的题感觉还不错。在这过程中让我最苦恼的还是用邻接表的存储结构,现在还是初步了解就不做总结吧。
#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;
}