hdu1532

链接:点击打开链接

题意:n条关系,m个节点,每条关系由三个字母c,s,e组成代表c节点到s节点的流量为e,问流到节点n最大流量是多少

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxx 99999999
using namespace std;
int s[505][505],dis[505],q[2005];
int n,m;
int bfs(){
    int i,l,h,u;
    memset(dis,-1,sizeof(dis));
    dis[1]=0;q[1]=1;
    l=0;h=1;
    while(l<h){
        u=q[++l];
        for(i=1;i<=n;i++)
        if(s[u][i]&&dis[i]==-1){
            dis[i]=dis[u]+1;
            q[++h]=i;
        }
    }
    if(dis[n]!=-1)
    return 1;
    return 0;
}                                        //bfs找是否还有增广路,并更新层次图
int dinic(int x,int sum){
    int i,a;
    if(x==n)
    return sum;
    for(i=1;i<=n;i++)
    if(s[x][i]>0&&(dis[i]==dis[x]+1)&&(a=dinic(i,min(sum,s[x][i])))){
        s[x][i]-=a;
        s[i][x]+=a;
        return a;
    }
    return 0;
}                                       //求每次沿增广路所走增加的流量
int main(){
    int i,j,a,b,c,ans,temp;
    while(scanf("%d%d",&m,&n)!=EOF){
        memset(s,0,sizeof(s));
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&c);
            s[a][b]+=c;
        }
        ans=0;
        while(bfs()){
        while(temp=dinic(1,maxx))
        ans+=temp;
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(hdu1532)