Drainage Ditches HDU - 1532
网络流模板题,用Dinic
//Dinic
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<queue>
using namespace std;
typedef long long ll;
const int maxx=205;
int n,m;
int s,t;
struct{
int v;
int w;
int nxt;
}e[500];
int head[maxx];
int dis[maxx];
int cnt=1;
void add(int x, int y, int w)
{
e[++cnt].v = y;
e[cnt].w = w;
e[cnt].nxt = head[x];
head[x] = cnt;
}
void init(){
cnt=1;
memset(head,0,sizeof(head));
}
bool bfs(){
memset(dis,0,sizeof(dis));
queue<int>q;
q.push(s);
dis[s]=1;
while(!q.empty()){
int temp=q.front();
q.pop();
for(int i=head[temp];i;i=e[i].nxt){
int v=e[i].v;
int w=e[i].w;
if(w&&!dis[v]){
dis[v]=dis[temp]+1;
q.push(v);
}
}
}
return dis[t];
}
ll dfs(int x,int f){
if(x==t)return f;
ll sum=0;
for(int i=head[x];i;i=e[i].nxt){
int v=e[i].v;
int w=e[i].w;
if(w&&dis[v]==dis[x]+1){
ll flow=dfs(v,min(f,w));
e[i].w-=flow;
e[i^1].w+=flow;
f-=flow;
sum+=flow;
}
}
if(!sum)dis[x]=0;
return sum;
}
int dinic(){
int ans=0;
while(bfs()){
ans+=dfs(s,0x3f3f3f3f);
}
return ans;
}
int main(){
while(scanf("%d%d",&m,&n)!=EOF){
init();a
s=1;
t=n;
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,0);
}
int ans=dinic();
printf("%d\n",ans);
}
return 0;
}