您的位置:首页 > 理论基础 > 计算机网络

HDU 2549 Flow Problem

2016-11-24 16:46 162 查看
[align=left]Problem Description[/align]
Network flow is a well-known difficult problem for ACMers. Given a graph, your task is to find out the maximum flow for the weighted directed graph.
 

[align=left]Input[/align]
The first line of input contains an integer T, denoting the number of test cases.

For each test case, the first line contains two integers N and M, denoting the number of vertexes and edges in the graph. (2 <= N <= 15, 0 <= M <= 1000)

Next M lines, each line contains three integers X, Y and C, there is an edge from X to Y and the capacity of it is C. (1 <= X, Y <= N, 1 <= C <= 1000)
 

[align=left]Output[/align]
For each test cases, you should output the maximum flow from source 1 to sink N.
 

[align=left]Sample Input[/align]

2
3 2
1 2 1
2 3 1
3 3
1 2 1
2 3 1
1 3 1

 

[align=left]Sample Output[/align]

Case 1: 1
Case 2: 2

 

[align=left]Author[/align]
HyperHexagon
 

[align=left]Source[/align]
HyperHexagon's Summer
Gift (Original tasks)
 

[align=left]Recommend[/align]
zhengfeng   |   We have carefully selected several similar problems for you:  3572 3416 3081 3491 1533 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

最大流~

还是模板题~

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;

int t,n,m,x,y,v,a[1001],ne[1001],ans,cnt;

struct edge{
int x,y,cap,flow;
edge(int u,int v,int k,int z):x(u),y(v),cap(k),flow(z) {}
};

vector<edge> ed;
vector<int> p[2001];

int main()
{
scanf("%d",&t);
while(t--)
{
ans=0;ed.clear();
for(int i=1;i<=n;i++) p[i].clear();
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d%d",&x,&y,&v);
ed.push_back(edge(x,y,v,0));
ed.push_back(edge(y,x,0,0));
int tot=ed.size();
p[x].push_back(tot-2);
p[y].push_back(tot-1);
}
while(1)
{
memset(a,0,sizeof(a));
queue<int> q;q.push(1);a[1]=999999999;
while(!q.empty())
{
int k=q.front();q.pop();int tot=p[k].size();
for(int i=0;i<tot;i++)
{
edge z=ed[p[k][i]];
if(!a[z.y] && z.cap>z.flow)
{
a[z.y]=min(a[k],z.cap-z.flow);
ne[z.y]=p[k][i];q.push(z.y);
}
}
if(a
) break;
}
if(!a
) break;
for(int i=n;i!=1;i=ed[ne[i]].x)
{
ed[ne[i]].flow+=a
;
ed[ne[i]^1].flow-=a
;
}
ans+=a
;
}
printf("Case %d: %d\n",++cnt,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息