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

hdu1532 Drainage Ditches

2018-03-07 23:09 120 查看
hdu1532

题意…emmm没什么好说的就是..n个点m条边…求网络流最大流

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define N 220
struct node{int x,y,z,next;}mp
;
int d
,h
,cur
,num,n,m,ans;
void insert(int x,int y,int z){
mp[++num].x=x;mp[num].y=y;mp[num].z=z;mp[num].next=h[x];h[x]=num;
mp[++num].x=y;mp[num].y=x;mp[num].z=0;mp[num].next=h[y];h[y]=num;
}
bool bfs(){
queue<int>q;q.push(1);
memset(d,0,sizeof(d));d[1]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=h[u];i;i=mp[i].next){
int v=mp[i].y;
if(mp[i].z && !d[v]){
d[v]=d[u]+1;q.push(v);
}
}
}return d
;
}
int dfs(int u,int s1){
if(u==n || !s1) return s1;int s2=s1;
for(int &i=cur[u];i;i=mp[i].next){
int v=mp[i].y;
if(mp[i].z && d[v]==d[u]+1){
int x=dfs(v,min(s1,mp[i].z));
mp[i].z-=x;mp[i^1].z+=x;s1-=x;
if(!s1) return s2;
}
} return s2-s1;
}
int main(){
while(scanf("%d%d",&m,&n)>0){
memset(h,0,sizeof(h));num=1;
for(int i=1;i<=m;i++){
int x,y,z;scanf("%d%d%d",&x,&y,&z);
insert(x,y,z);
}ans=0;
while(bfs()){
memcpy(cur,h,sizeof(cur));
ans+=dfs(1,0x7fffffff);
}printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: