Cod sursa(job #902983)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 1 martie 2013 17:52:10
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<cstdio>
#include<vector>
#include<deque>
#include<cstring>
#include<algorithm>
#define INF 1001

using namespace std;

int cap[INF][INF],flow[INF][INF],n,m,t[INF],ras=0;
bool used[INF];
deque<int> Q;
vector<int> graph[INF];

int bf()
{
    int ret=0;
    memset(t,0,sizeof(t));
    t[1]=-1;
    Q.clear();
    Q.push_back(1);
    while(Q.size()>0)
    {
        int nod=Q.front();
        for(int i=0;i<graph[nod].size();++i)
        {
            int nod2=graph[nod][i];
            if(t[nod2]==0&&cap[nod][nod2]-flow[nod][nod2]>0)
        {

            if(nod2==n)ret=1;
            else
            {
                t[nod2]=nod;
                Q.push_back(nod2);
            }
        }
        }
        Q.pop_front();
    }
    return ret;
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;++i)
    {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        cap[x][y]+=c;
        graph[x].push_back(y);
        graph[y].push_back(x);
    }
    while(bf())
    {
        for(int i=0;i<graph[n].size();++i)
        {
            int nod=graph[n][i];
            if(t[nod]&&cap[nod][n]-flow[nod][n]>0)
            {
                t[n]=nod;
                int minim = 9999999999;
                for(int j=n;j!=1;j=t[j])
                    minim=min(minim,cap[t[j]][j]-flow[t[j]][j]);
                ras+=minim;
                for(int j=n;j!=1;j=t[j])
                {
                    flow[t[j]][j]+=minim;
                    flow[j][t[j]]-=minim;
                }
            }
        }
    }
    printf("%d\n",ras);
}