Cod sursa(job #558093)

Utilizator acelasi7Tudor Maxim acelasi7 Data 17 martie 2011 08:28:06
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include<cstdio>
#include<cstring>
#include<climits>
#include<vector>
#include<queue>
using namespace std;
#define nrn 1005
#define inf INT_MAX

vector<int>V[nrn];
queue<int>Q;
int tata[nrn],uz[nrn],SOL,best;
int C[nrn][nrn],F[nrn][nrn];

FILE *in=fopen("maxflow.in","r"),*out=fopen("maxflow.out","w");

void flux(int node)
{
    int tatn,tt;
    best=inf;
    tatn=node;
    tt=tata[tatn];
    while(tatn!=tt)
    {
        best=min(best,C[tt][tatn]-F[tt][tatn]);
        tatn=tt;
        tt=tata[tt];
    }
    SOL+=best;
    tatn=tata[node];
    F[tatn][node]+=best;
    F[node][tatn]-=best;

    while(tatn!=node)
    {
        //uz[node]=1;
        node=tatn;
        tatn=tata[tatn];
        F[tatn][node]+=best;
        F[node][tatn]-=best;
    }
}
int main()
{
    int a,b,c,n,m,i,node;
    int grint[nrn],grext[nrn];
    memset(grint,0,sizeof(grint));
    memset(grext,0,sizeof(grext));
    fscanf(in,"%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        fscanf(in,"%d%d%d",&a,&b,&c);
        V[a].push_back(b);
        C[a][b]=c;
        grint[b]++;grext[a]++;
    }
    fclose(in);
    for(i=1;i<=n;++i)
        if(!grint[i])
            V[0].push_back(i);

    int ok=1;
    while(ok)
    {
        ok=0;
        for(i=0;i<(int)V[0].size();++i)
        {
            Q.push(V[0][i]);
            tata[i+1]=V[0][i];
        }
        memset(uz,0,sizeof(uz));
        while(!Q.empty())
        {
            node=Q.front();
            Q.pop();
            if(!grext[node])
            {
                flux(node);
                ok=1;
                continue;
            }
            for(i=0;i<(int)V[node].size();++i)
                if((C[node][V[node][i]]-F[node][V[node][i]])>0&&(!uz[node]||!uz[V[node][i]]))
                {
                    if(grext[V[node][i]]&&grint[V[node][i]])
                        uz[V[node][i]]=1;
                    tata[V[node][i]]=node;
                    Q.push(V[node][i]);
                }
        }
    }
    fprintf(out,"%d\n",SOL);
    fclose(out);
    return 0;
}