poj1273 Drainage Ditches

//356K 0MS第一道网络流的题,注意重边

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
int linjie[220][220];
bool visit[220];
int pre[220];//找这个节点之前的节点
int N,M;
queue<int>Q;
void dayin()
{
    int i,j;
    for(i=1;i<=M;i++)
    {
        for(j=1;j<=M;j++)
        {
            printf("%d ",linjie[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
int augment()
{
    memset(visit,false,sizeof(visit));
    memset(pre,0,sizeof(pre));
    pre[1]=1;
    while(!Q.empty())
    {
        Q.pop();
    }
    int i;
    int qi=1;
    Q.push(qi);
    visit[1]=true;
    bool found=false;;
    while(!Q.empty())
    {
        int temp=Q.front();Q.pop();
        for(i=1;i<=M;i++)
        {
            if(linjie[temp][i]!=0&&!visit[i])
            {
                if(i==M)
                {
                    found=true;
                }
                Q.push(i);
                pre[i]=temp;
                visit[i]=true;
                if(found)
                {
                    break;
                }
            }
        }
        if(found)
        {
            break;
        }
    }
    int minflow=-1;
    int linshi=M;
    while(pre[linshi]!=linshi)
    {
        if(linjie[pre[linshi]][linshi]<minflow||minflow==-1)
        {
            minflow=linjie[pre[linshi]][linshi];
        }
        linshi=pre[linshi];
    }
    linshi=M;
    while(pre[linshi]!=linshi)
    {
        linjie[pre[linshi]][linshi]-=minflow;
        linjie[linshi][pre[linshi]]+=minflow;
        linshi=pre[linshi];
    }
    //dayin();
    return minflow;

}

int main()
{
    while(scanf("%d %d",&N,&M)!=EOF)
    {
        int i,j;
        for(i=1;i<=M;i++)
        {
            for(j=1;j<=M;j++)
            {
                linjie[i][j]=0;
            }
        }
        int a,b,c;
        for(i=0;i<N;i++)
        {
            scanf("%d %d %d",&a,&b,&c);
            linjie[a][b]+=c;
        }
        //dayin();
        int maxflow=0;
        int aug;
        while(aug=augment())
        {
            maxflow+=aug;
            //dayin();
        }
        printf("%d\n",maxflow);
    }
    return 0;
}
posted @ 2012-07-28 21:20  willzhang  阅读(129)  评论(0编辑  收藏  举报