HDU1530 最大流问题

    第一次写Dinic 然后贴一下 最基础的网络流问题 嘎嘎:

#include <iostream>
#include<cstdio>
#include<string.h>
#include<queue>
using namespace std;
const int M=205;
__int64 map[M][M];
int n,m,dist[M];
queue<int>q;
void readdate()
{
    __int64 i,a,b,c;
    for(i=0;i<n;i++)
    {
        scanf("%I64d%I64d%I64d",&a,&b,&c);
        map[a][b]+=c;
    }
}
bool BFS()
{
    while(!q.empty()){q.pop();}
    int x,i;
    memset(dist,-1,sizeof(dist));
    q.push(1);
    dist[1]=0;
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        for(i=1;i<=m;i++)
        if(dist[i]<0&&map[x][i]>0)
        {
            dist[i]=dist[x]+1;
            q.push(i);
        }
    }
    if(dist[m]==-1)return 0;
    else return 1;

}
__int64 min_vual(__int64 a,__int64 b)
{
    return a>b?b:a;
}
__int64 find(int a,__int64 low)
{
    __int64 aq,i;
    if(a==m)return low;
    for(i=1;i<=m;i++)
    if(dist[a]==dist[i]-1&&map[a][i]>0&&(aq=find(i,min_vual(low,map[a][i]))))
    {
        map[a][i]-=aq;
        map[i][a]+=aq;
        return aq;
    }
    return 0;
}
int main()
{
    __int64 temp,ans;
    while(scanf("%d%d",&n,&m)==2)
    {
        ans=0;
        memset(map,0,sizeof(map));

        readdate();
        while(BFS())
        {
            while((temp=find(1,1<<30)))ans+=temp;
        }
        printf("%I64d\n",ans);
    }

    return 0;
}


 

 

posted @ 2013-11-23 22:12  来自大山深处的菜鸟  阅读(217)  评论(0编辑  收藏  举报