HDU1532 Drainage Ditches

題意:某農民有莊稼地,每到下雨就被淹,變成了池塘,於是農民就修建了水渠將水從莊稼地中導出,水渠有幾個中轉站(也可能沒有),莊稼地的水最後流到小溪。題目告訴你,莊稼地、中轉站、小溪之間的水渠連接狀況(兩點之間會有多條邊),以及各段水渠的最大水流速度。問,莊稼地裏的水的最大導出速度是多少?

很明顯,這是一道網絡流中的最大流問題,我用的是Ford-Fulkerson解決的。

代碼如下:

#include<iostream>
#include<cstdio>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
int const maxm=205;
const long long INF=1e+18;
typedef struct
{
    int to;
    long long flow;
    int biaohao;
}edge;
vector<edge>node[maxm];
bool used[maxm];
void init(int m)//一定要注意初始化,我在這裏WA了三次
{
    for(int i=1;i<=m;i++)
        node[i].clear();
}
void add_edge(int a,int b,long long c)
{
    edge ed;
    ed.to=b;
    ed.flow=c;
    ed.biaohao=node[b].size();
    node[a].push_back(ed);
    ed.to=a;
    ed.flow=0;
    ed.biaohao=node[a].size()-1;
    node[b].push_back(ed);
}

long long dfs(int v,int e,long long f)
{
    if(v==e) return f;
    used[v]=1;
    for(int i=0;i<node[v].size();i++)
    {
        int u=node[v][i].to;
        long long f1=node[v][i].flow;
        if(!used[u]&&f1!=0)
        {
            long long f2=dfs(u,e,min(f1,f));
            if(f2>0)
            {
                node[v][i].flow-=f2;
                node[u][node[v][i].biaohao].flow+=f2;
                return f2;
            }
        }
    }
    return 0;
}
long long max_flow(int s,int e)
{
    long long ff=0;
    for(;;)
    {
        memset(used,0,sizeof(used));
        long long f=dfs(s,e,INF);
        if(f==0)return ff;
        ff+=f;
    }
}
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        int a,b;
        long long c;
        init(m);
        for(int i=0;i<n;i++)
        {
            cin>>a>>b>>c;
            add_edge(a,b,c);
        }
        cout<<max_flow(1,m)<<endl;

    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章