一开始看到网络流的代码比较头疼,之后硬着头皮把代码中的每一个变量的用途都仔仔细细的弄清楚了,学起来就比较轻松了,这也是一种比较好的方法吧,下面就把有自己写的有详细注解的代码贴上。
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int arraysize=201;
const int INF=0x7fffffff;
int capacity[arraysize][arraysize]; <span style="color:#FF0000;">///建图</span>
int flow[arraysize]; <span style="color:#FF0000;">///为了记录下每条路径下的最小流量</span>
int pre[arraysize]; <span style="color:#FF0000;">///找到从源点到汇点的一条路径,方便回溯</span>
int n,m;
queue<int> que; <span style="color:#FF0000;"> ///bfs时记录下每一层</span>
int BFS(int src,int des)
{
while(!que.empty())
{
que.pop();
}
memset(pre,-1,sizeof(pre));
pre[src]=0;
flow[src]=INF;
que.push(src); <span style="color:#FF0000;">///起点放到队列中</span>
while(!que.empty())
{
int index=que.front();
que.pop();
if(index==des) <span style="color:#FF0000;">///说明已经找到了从起点到汇点的一条路径</span>
break;
for(int i=1;i<m+1;i++)
{
if(i!=src&&capacity[index][i]>0&&pre[i]==-1) <span style="color:#FF0000;">///加上pre[i]==-1是因为capacity[i][index]在后面加上大于0,但pre[index]是!= -1的;</span>
{
pre[i]=index;
flow[i]=min(capacity[index][i],flow[index]); <span style="color:#FF0000;"> ///更新·这条路径上的最小流量;</span>
que.push(i);
}
}
}
if(pre[des]==-1) <span style="color:#FF0000;">///说明在que空的时候还没有找到到des的路径,说明没有路可以走了;</span>
return -1;
else
return flow[des]; <span style="color:#FF0000;">///返回找到的一条路径上的最小流量;</span>
}
int maxFlow(int src,int des)
{
int increasement=0;
int sumflow=0;
while((increasement=BFS(src,des))!=-1)
{
int k=des;
while(k!=src) <span style="color:#FF0000;"> ///从终点回溯到起点</span>
{
int last=pre[k];
capacity[last][k]-=increasement; <span style="color:#FF0000;">///和上面的capacity[index][i]>0的判断一起保证路径上的最小流量的那一段被封闭掉;</span>
<span style="color:#FF0000;"> ///等到找下一条路径的时候就不会再走封闭掉的那一段了;</span>
capacity[k][last]+=increasement;
k=last;
}
sumflow+=increasement;
}
return sumflow;
}
int main()
{
int start,end,ci;
while(~scanf("%d%d",&n,&m))
{
memset(capacity,0,sizeof(capacity));
memset(flow,0,sizeof(flow));
for(int i=0;i<n;i++)
{
cin>>start>>end>>ci;
if(start==end)
continue;
capacity[start][end]+=ci;
}
printf("%d\n",maxFlow(1,m));
}
return 0;
}