Cod sursa(job #1691307)

Utilizator cristyursChris Andrew cristyurs Data 17 aprilie 2016 21:22:13
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define NMAX 1024
#define inf 0x3f3f3f3f
using namespace std;
int x,y,z,i,j,k,l,m,n,flux,fmin;
int tata[NMAX],viz[NMAX];
int C[NMAX][NMAX],C1[NMAX][NMAX];
vector<int> T[NMAX];
queue <int> coada;
void zero()
{
    int i;
    for(i=1;i<n+1;i++)
        viz[i]=0;
     while(!coada.empty())
        coada.pop();
}
void zero1()
{
    int i;
    for(i=1;i<n+1;i++)
        tata[i]=0;
}
int bfs()
{
    int nod;
    int nod1;
    zero();
    coada.push(1);
    viz[1]=1;
    while(!coada.empty())
    {
        nod=coada.front();
        coada.pop();
        for(i=0;i<T[nod].size();i++)
        {
            nod1=T[nod][i];
            if(C[nod][nod1]==C1[nod][nod1]||viz[nod1]) continue;
            viz[nod1]=1;
            tata[nod1]=nod;
            coada.push(nod1);
            if(nod1==n) return 1;
        }
    }
return 0;
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d %d", &n ,&m);
    for(i=1;i<m+1;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        C[x][y]=C[x][y]+z;
        T[x].push_back(y);
        T[y].push_back(x);
    }
while(bfs()==1)
   {
     fmin=inf;
     for(i=n;i!=1;i=tata[i])
       if(fmin>C[tata[i]][i]-C1[tata[i]][i]) fmin=C[tata[i]][i]-C1[tata[i]][i];
     for(i=n;i!=1;i=tata[i])
     {
         C1[tata[i]][i]=C1[tata[i]][i]+fmin;
         C1[i][tata[i]]=C1[i][tata[i]]-fmin;
     }
     flux=flux+fmin;
   }
printf("%d",flux);
return 0;
}