2 3 2 1 2 1 2 3 1 3 3 1 2 1 2 3 1 1 3 1
Case 1: 1 Case 2: 2
n个点m条边,找到1到n使得流量最大。
解题思路;找出所有的增广路径,然后再找增广路径上的边,找出最小的流量!!
#include <cstdio>
#include <cmath>
#include <queue>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n,m;
int map1[1001][1001];
int pre[1001];
int vis[1001];
int s,t;
bool BFS()
{
int i,cur;
queue<int>q;
memset(pre,0,sizeof(pre));
memset(vis,0,sizeof(vis));
vis[s]=1;
q.push(s);
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur==t)
return 1;
for(i=1; i<=n; i++)
{
if(!vis[i] &&map1[cur][i])
{
q.push(i);
pre[i]=cur;
vis[i]=1;
}
}
}
return 0;
}//找增广路径
int Max_flow()
{
int i,ans=0;
while(1)
{
if(!BFS())
return ans;
int Min=0x7f7f7f7f;
for(i=t; i!=s; i=pre[i])
Min=min(Min,map1[pre[i]][i]);
for(i=t; i!=s; i=pre[i])
{
map1[pre[i]][i]-=Min;
map1[i][pre[i]]+=Min;
}
ans+=Min;
}
}//找增广路径上的最小流量
int main()
{
int T;
cin>>T;
int v,u,c;
int k=1;
while(T--)
{
scanf("%d%d",&n,&m);
memset(map1,0,sizeof(map1));
s=1,t=n;
while(m--)
{
scanf("%d%d%d",&u,&v,&c);
map1[u][v]+=c;
}
printf("Case %d: %d\n",k++,Max_flow());
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/sky_miange/article/details/47212261