很直白的网络最大流,我第一次好好做网络流,费整整一天呀!菜呀~~
代码如下:
#include<iostream>
#include<queue>
using namespace std;
const int Max=205;
const int inf=99999999;
int n,m,ans;
int map[Max][Max],pre[Max];
bool vis[Max];
int min(int a,int b)
{
return a<b ? a:b;
}
bool bfs() //寻找增广路径
{
queue<int> que;
que.push(1);
memset(vis,0,sizeof(vis));
vis[1]=true;
while(!que.empty())
{
int u=que.front();
if(u==n) return true;
que.pop();
for(int i=1;i<=n;i++)
if(!vis[i] && map[u][i])
{
pre[i]=u;
que.push(i);
vis[i]=true;
}
}
return false;
}
void end() //end注满增广路径
{
int i,sum=inf;
for(i=n;i!=1;i=pre[i])
sum=min(sum,map[pre[i]][i]);//找出一条权值最小的路径
for(i=n;i!=1;i=pre[i])
{
map[pre[i]][i]-=sum; //求出每条边的残留量
map[i][pre[i]]+=sum; //逆的边要再增加
}
ans+=sum;
}
int main()
{
int u,v,w;
while(cin>>m>>n)
{
memset(map,0,sizeof(map));
ans=0;
while(m--)
{
cin>>u>>v>>w;
map[u][v]+=w; //可能出现重边。
}
while(bfs()) end();
cout<<ans<<endl;
}
return 0;
}