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;
}
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;
}
相关文章推荐
- hdu 2549 Flow Problem 最大流
- HDU 3549 Flow Problem
- HDU 3549 Flow Problem 最大流 最小增广路 SAP算法 从EK算法的753MS降到了46MS
- HDU 3549 Flow Problem(有向边网络流)
- HDU 2549.壮志难酬
- HDU 3549 Flow problem
- HDU - 3549 Flow Problem
- HDU 3549 Flow Problem(最大流)
- HDU 3549 Flow Problem (dinic模版 && isap模版)
- HDU 3549 Flow Problem 网络最大流问题 EK、Dinic、ISAP三种算法
- 【HDU】 3549 Flow Problem
- hdu 3549 Flow Problem 最大流模板题 Ford-Fulkerson算法
- [ACM] hdu 3549 Flow Problem (最大流模板题)
- HDU 3549 Flow Problem 网络流 ISAP
- HDU 3549 Flow Problem (用一道最裸的最大流开启网络流算法之路)
- HDU 2549 Sumset Hash+枚举
- POJ 1273(HDU 1532) Drainage Ditches|HDU 3549 Flow Problem|很典型&&裸的网络流
- HDU-2549-壮志难酬
- hdu 3549 Flow Problem(EK)
- HDU 3549 Flow Problem【最大流入门题】【Ford-Fulkerson算法】【Dinic算法】【ISAP算法】