1. 程式人生 > 實用技巧 >hdu1532(最大流模板)

hdu1532(最大流模板)

http://acm.hdu.edu.cn/showproblem.php?pid=1532

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int Ni = 210;
struct Edge{
    int u,v,c;
    int next;
}edge[20*Ni];
int n,m;
int edn;//=cnt邊數
int p[Ni];//父親
int d[Ni];//分層 
int sp,tp;//原點,匯點
void add(int u,int v,int c)
{
    edge[edn].u
=u; edge[edn].v=v; edge[edn].c=c; edge[edn].next=p[u]; p[u]=edn++; edge[edn].u=v; edge[edn].v=u; edge[edn].c=0; edge[edn].next=p[v]; p[v]=edn++; } int bfs() { queue <int> q; memset(d,-1,sizeof(d)); d[sp]=0; q.push(sp); while(!q.empty()) { int cur=q.front(); q.pop();
for(int i=p[cur];i!=-1;i=edge[i].next) { int u=edge[i].v; if(d[u]==-1 && edge[i].c>0) { d[u]=d[cur]+1; q.push(u); } } } return d[tp] != -1; } int dfs(int a,int b) { int r=0; if(a==tp)return b; for(int
i=p[a];i!=-1 && r<b;i=edge[i].next){ int u=edge[i].v; if(edge[i].c>0 && d[u]==d[a]+1){ int x=min(edge[i].c,b-r); x=dfs(u,x); r+=x; edge[i].c-=x; edge[i^1].c+=x; } } if(!r)d[a]=-2; return r; } int dinic(int sp,int tp) { int total=0,t; while(bfs()) { while(t=dfs(sp,inf)) total+=t; } return total; } int main(){ int i,u,v,c; while(~scanf("%d%d",&m,&n)) { edn=0;//初始化 memset(p,-1,sizeof(p)); sp=1;tp=n; for(i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&c); add(u,v,c); } printf("%d\n",dinic(sp,tp)); } return 0; }
View Code