poj-1273(最大流)

题解:纯板子题。。。

EK算法

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
#define maxn 205
#define maxx 1e12
#define ll long long
using namespace std;
ll flow[maxn];//流量到达每个顶点的剩余流量;
ll c[maxn][maxn];//残余网络;
ll n,m;
ll pre[maxn];
queue<int>que;
int bfs(int s,int e)
{
    memset(pre,-1,sizeof(pre));
    while(!que.empty())
        que.pop();
    pre[s]=0;flow[s]=maxx;que.push(s);
    while(!que.empty())
    {
        int temp=que.front();
        que.pop();
        if(temp==e)
            break;
        for(int i=1;i<=n;i++)
        {
            if(i!=s&&c[temp][i]>0&&pre[i]==-1)
            {
                pre[i]=temp;
                flow[i]=min(c[temp][i],flow[temp]);
                que.push(i);
            }
        }
    }
    if(pre[e]==-1)
        return -1;
    else
        return flow[e];
}
int maxflow(int s,int e)
{
    long long int tempsum=0;
    long long int anssum=0;
    while((tempsum=bfs(s,e))!=-1)
    {
        int k=e;
        while(k!=s)
        {
            int last=pre[k];
            c[last][k]-=tempsum;
            c[k][last]+=tempsum;
            k=last;
        }
        anssum+=tempsum;
    }

    return anssum;
}
int main()
{
    int x,y,w;
    while(cin>>m>>n)
    {
        memset(c,0,sizeof(c));
        memset(flow,0,sizeof(flow));
        for(int i=1;i<=m;i++)
        {
            cin>>x>>y>>w;
            c[x][y]+=w;
        }
        long long int  ans=maxflow(1,n);
        cout<<ans<<endl;
    }
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/huangdao/p/8987566.html
今日推荐