网络流之最大流 POJ 1273

来源:互联网 发布:java调用python程序 编辑:程序博客网 时间:2024/05/22 07:07

这个讲义不错:

http://wenku.baidu.com/link?url=cOZl5gOfcSd1OXDhQmM-je3MjGxFtSYyPCr1Rmsv-7SnIA7Dvftb7xmgfGPnfgIAl7x3O0CnSdy2bHuNUVwteQxFkfIUbRTbs8Yeq1d5_NG

代码:

#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define ll long long#define maxn 500#define maxm 500#define inf 2147483647using namespace std;inline void read(int &x){    char ch;    bool flag=false;    for (ch=getchar();!isdigit(ch);ch=getchar())if (ch=='-') flag=true;    for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());    x=flag?-x:x;}inline void write(int x){    static const int maxlen=100;    static char s[maxlen];        if (x<0){putchar('-'); x=-x;}    if(!x){ putchar('0'); return; }    int len=0; for(;x;x/=10) s[len++]=x % 10+'0';    for(int i=len-1;i>=0;--i) putchar(s[i]);}int deep[maxn],now[maxn];int v[maxm],st[maxm],ed[maxm],pre[maxm],tot;int ans,m,n;void build(int a,int b,int c){pre[++tot]=now[a];now[a]=tot;st[tot]=a;ed[tot]=b;v[tot]=c;}int d[maxn],t,w;bool bfs(){memset(deep,-1,sizeof(deep));d[1]=1;t=1;w=1;deep[1]=0;while (t<=w){int x=d[t];for (int p=now[x];p;p=pre[p])if (v[p])if (deep[ed[p]]<0){int y=ed[p];deep[y]=deep[x]+1;d[++w]=y;if (y==n) {/*for (int i=1;i<=n;i++)printf("%d ",deep[i]);puts("");*/return 1;}}t++;}return 0;}int dfs(int x,int Min){if (x==n) return Min;int ans=0;for (int p=now[x];p;p=pre[p]){if (v[p] && deep[ed[p]]>deep[x]){int tmp=dfs(ed[p],min(Min,v[p]));v[p]-=tmp; v[p^1]+=tmp;ans+=tmp;  Min-=tmp;if (!Min) return ans;}}deep[x]=-1; return ans;}int main(){while (scanf("%d%d",&m,&n)!=EOF){tot=1;ans=0;memset(now,0,sizeof(now));for (int i=1;i<=m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);build(a,b,c);build(b,a,0);}for (;bfs();ans+=dfs(1,inf));printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击