Cod sursa(job #1967405)

Utilizator Cudrici_CarinaCudrici Carina Cudrici_Carina Data 16 aprilie 2017 16:29:34
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <queue>
#include <cstdio>
using namespace std;
const int Dim=1001;
const int Inf=0x3f3f3f3f;
int a[Dim][Dim],t[Dim],n,m,flux;
queue <int> Q;
vector<int> viz;

void ReadGraph()
{
    int x,y,c;
    scanf("%d",&n);
    scanf("%d",&m);
    viz=vector<int>(n+1,0);
    for (int i=1; i<=m; i++)
    {
         scanf("%d",&x);
         scanf("%d",&y);
         scanf("%d",&c);
        a[x][y]=c;
    }
}

void Bfs(int x)
{
viz=vector<int>(n+1,0);
for( Q.push(x); !Q.empty(); Q.pop())
    {
        x=Q.front();
        for(int i=1; i<=n; i++)
        {
            if(a[x][i]<=0) continue;
            if(viz[i]==1) continue;
            Q.push(i);
            viz[i]=1;
            t[i]=x;
        }
    }
}


inline void  FluxMinim()
{
    while (true)
    {
        Bfs(1);
        if (viz[n]==false) break;
        for(int j=1; j<=n; j++)
            if (a[j][n] > 0)
            {
                int fmax=a[j][n];

                for (int i=j; i!=1; i=t[i])
                      fmax=min(fmax,a[t[i]][i]);
                a[j][n]-= fmax;
                a[n][j]+= fmax;
                for (int i=j; i!=1; i=t[i])
                {
                    a[t[i]][i]-=fmax;
                    a[i][t[i]]+=fmax;
                }
                flux+=fmax;
            }
    }
}
int main()
{
     freopen("maxflow.in","r",stdin);
     freopen("maxflow.out","w",stdout);

    ReadGraph();
    FluxMinim();
    printf("%d\n",flux);



    return 0;
}