网络流最大流算法参考程序

来源:互联网 发布:ubuntu界面太小 编辑:程序博客网 时间:2024/04/30 20:02
#include<stdio.h>#include<stdlib.h>int c[101][101],f[101][101],p[101],m,n,d[10000],pre[101];int main(){    int i,j,k=1,top,last;    scanf("%d%d",&n,&m);    int x,y,z;    for(i=1;i<=m;i++){        scanf("%d%d%d",&x,&y,&z);                          c[x][y]=z;c[y][x]=z;    }    while(k){        k=0;        top=0;last=1;d[1]=1;        for(i=1;i<=n;i++)p[i]=0;        p[1]=1;        while(top<last){            top++;            x=d[top];            for(i=2;i<=n;i++)                   if(!p[i] && (c[x][i]>f[x][i] || f[i][x]>0)){                    d[++last]=i;                    p[i]=1;                    pre[i]=x;                             if(i==n){k=1;break;}                }                   if(k==1)break;        }        if(k==0)break;        int min=10000000;        x=n;        while(x!=1){            if(c[pre[x]][x]>f[pre[x]][x]&& c[pre[x]][x]-f[pre[x]][x]<min)                min=c[pre[x]][x]-f[pre[x]][x];                        else if(f[x][pre[x]]>0 && f[x][pre[x]]<min)                min=f[x][pre[x]];            x=pre[x];        }        x=n;        while(x!=1){            if(c[pre[x]][x]>f[pre[x]][x])                f[pre[x]][x]+=min;                        else if(f[x][pre[x]]>0)                f[x][pre[x]]-=min;            x=pre[x];        }                         }    int max=0;    for(i=2;i<=n;i++)        max+=f[1][i];    printf("%d\n",max);        system("pause");    return 0;    }


2 0
原创粉丝点击