标签:
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 62877 | Accepted: 24226 |
Description
Input
Output
Sample Input
5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10
Sample Output
50
题意:告诉m条水渠,n个点,1是起点,n是终点,求终点的最大流量。
分析:比较基础的网络流求最大流。数据比较小,直接采用一般增广路算法即标号法。
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#define INF 99999999
const int N = 222;
using namespace std;
int n,m;
int qu[N];
int pre[N];
int cus[N][N];
int flow[N][N];
int main()
{
while(~scanf("%d%d",&m,&n))
{
int a,b,c;
memset(cus,0,sizeof cus);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
cus[a][b]+=c;//注意每个点可能有多个边连接过来,所以最大值是求和
}
memset(flow,0,sizeof flow);
while(1)
{
for(int i=1;i<=n;i++)
pre[i]=-2;
pre[1]=-1;
int mmin=INF;
int qs=0,qe=1;
qu[qs]=1;
while(qs<qe && pre[n]==-2)
{
int v=qu[qs++];
for(int i=1;i<=n;i++)
{
int p=cus[v][i]-flow[v][i];
if(p && pre[i]==-2)
{
pre[i]=v;
qu[qe++]=i;
mmin=min(mmin,p);
}
}
}
if(pre[n]==-2)break;
for(int i=pre[n],j=n;i!=-1;j=i,i=pre[i])
{
flow[i][j]+=mmin;
flow[j][i]=-flow[i][j];
}
}
int ans=0;
for(int i=1;i<=n;i++)
ans+=flow[i][n];
printf("%d\n",ans);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/wust_zjx/article/details/47703109