您的位置:首页 > 大数据 > 人工智能

NYOJ323_Drainage Ditches+最大流

2017-04-11 13:59 274 查看
原题地址:点击打开链接

#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
using namespace std;
#define MAX 1<<31-1
int min(int x,int y)
{
return x<y?x:y;
}
struct Edge
{
int to;
int cap;
int rev;
};
vector<Edge>g[210];
int used[210],n,m;
void add_edge(int from,int to,int cap) //加边
{
Edge e1={to,cap,g[to].size()};
g[from].push_back(e1);
Edge e2={from,0,g[from].size()-1};
g[to].push_back(e2);
}
int dfs(int u,int f)
{
int i,v;
if(u==m)
return f;
for(i=0;i<g[u].size();i++)
{
Edge &e=g[u][i];
if(e.cap>0&&used[e.to]!=1)
{
used[e.to]=1;
int d=dfs(e.to,min(e.cap,f));
if(d>0)
{
e.cap-=d;
g[e.to][e.rev].cap+=d;
return d;
}
}
}
return 0;
}
int max_flow()
{
int res=0;
while(1)
{
memset(used,0,sizeof(used));
used[1]=1;
int d=dfs(1,MAX); //找寻增广路
if(d<=0)
break;
res+=d;
}
return res;
}
int main()
{
int i,u,v,c;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++)
g[i].clear();
for(i=0;i<n;i++)
{
scanf("%d%d%d",&u,&v,&c);
add_edge(u,v,c);
}
int res=max_flow();
printf("%d\n",res);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息