#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
const int N=405;
const double esp=1e-8;
int n,m;
int head[N];
int tot;
int INF=2e9+10;
void init(){
memset(head,-1,sizeof head);
tot=0;
}
struct Edge{
int to,w,nxt;
}edge[N*2];
void addEdge(int u,int v,int w){
edge[tot].to=v;
edge[tot].w=w;
edge[tot].nxt=head[u];
head[u]=tot++;
edge[tot].to=u;/*fanxiangbian*/
edge[tot].w=0;
edge[tot].nxt=head[v];
head[v]=tot++;
}
int level[N];
int q[N];
void bfs(int s,int t){
memset(level,0,sizeof level);
level[s]=1;
int front=0,rear=1;
q[front]=s;
while(front < rear ){
int x=q[front++];
for(int k=head[x];~k;k=edge[k].nxt){
int v=edge[k].to,w=edge[k].w;
if(!level[v] && w){
level[v]=level[x]+1;
q[rear++]=v;
}
}
}
}
int dfs(int u,int f,int t){
if(u==t) return f;
int ret=0;
for(int k=head[u];~k;k=edge[k].nxt){
int v=edge[k].to;
int w=edge[k].w;
if(level[u]+1==level[v] && f && w){
int dd=dfs(v,min(f,w),t);
edge[k].w-=dd;
edge[k^1].w+=dd;
if(u!=1)f-=dd;
ret+=dd;
}
}
return ret;
}
int dinic(int s,int t){
int ret=0;
while(true) {
bfs(s,t);
if(level[m]==0) break;
ret+=dfs(s,INF,t);
}
return ret;
}
int main()
{
#ifndef ONLINE_JUGDE
//freopen("aaa","r",stdin);
#endif // ONLINE_JUGDE
int T;
while(~scanf("%d%d",&n,&m)){
init();
for(int i=0;i<n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
}
}
return 0;
}
hdu1532 网络流入门 dinic
最新推荐文章于 2016-02-12 16:45:55 发布