Cod sursa(job #558139)

Utilizator acelasi7Tudor Maxim acelasi7 Data 17 martie 2011 09:19:25
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2 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],grext[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 bfs()
{
    int i,node;
    memset(uz,0,sizeof(uz));
    for(i=0;i<(int)V[0].size();++i)
        {
            Q.push(V[0][i]);
            tata[V[0][i]]=V[0][i];
            uz[V[0][i]]=1;
        }
    while(!Q.empty())
    {
        node=Q.front();
        Q.pop();
        if(!grext[node])
            return node;
        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]]))
            {
                uz[V[node][i]]=1;
                tata[V[node][i]]=node;
                Q.push(V[node][i]);
            }
        }
    }
    return 0;
}
int main()
{
    int a,b,c,n,m,i,node;
    int grint[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);
        V[b].push_back(a);
        C[a][b]=c;
        grint[b]++;grext[a]++;
    }
    fclose(in);
    for(i=1;i<=n;++i)
        if(!grint[i])
            V[0].push_back(i);

    while(node=bfs())
    {
        flux(node);

    }
    fprintf(out,"%d\n",SOL);
    fclose(out);
    return 0;
}