Flow Problem
Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 5111 Accepted Submission(s): 2385
Problem Description
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.
Input
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)
Output
For each test cases, you should output the maximum flow from source 1 to sink N.
Sample Input
2 3 2 1 2 1 2 3 1 3 3 1 2 1 2 3 1 1 3 1
Sample Output
Case 1: 1 Case 2: 2
Author
HyperHexagon
Source
HyperHexagon’s Summer Gift (Original tasks)
Recommend
zhengfeng
题意:给你 n 个点【1 … n】, m 条边 ( 2 <= N <= 15, 0 <= M <= 1000)
给出m条边的起点x,终点y,容量c(1<=c<=1000)
求第一个点到第n个点的最大流量
算法:最大流增广路模板题。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cstdio>
using namespace std;
const int maxn=20;
const int INF=1000000+10;
int cap[maxn][maxn];//容量
int flow[maxn][maxn];//流量
int a[maxn];//a[i]记录从s到i的最小残量
int p[maxn];//p[i]记录结点i的前驱结点
int main()
{
int T,n,m,k=1;
cin>>T;
while(T--)
{
cin>>n>>m;//n个结点,m条边
memset(cap,0,sizeof(cap));
memset(flow,0,sizeof(flow));
int x,y,c;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>c;
cap[x][y]+=c;// 因为可能会出现两个点有多条边的情况,所以需要全部加起来
}
int s=1,t=n;
queue<int> q;
int sum=0;//总流量
while(1)//BFS找增广路
{
memset(a,0,sizeof(a));
q.push(s);
a[s]=INF;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int v=1;v<=n;v++)
{
if(!a[v]&&cap[u][v]>flow[u][v])
{
p[v]=u;
q.push(v);
a[v]=min(a[u],cap[u][v]-flow[u][v]);// s-v 路径上的最小残量
}
}
}
if(!a[t])break;// 找不到, 则当前流已经是最大流, 跳出循环
for(int u=t;u!=s;u=p[u])// 从汇点往回走
{
flow[p[u]][u]+=a[t];//更新正向流
flow[u][p[u]]-=a[t];//更新反向流
}
sum+=a[t];// 更新从 s 流出的总流量
}
printf("Case %d: %d\n", k++, sum);
}
return 0;
}