Cod sursa(job #1702120)

Utilizator ASTELOTudor Enescu ASTELO Data 14 mai 2016 15:57:52
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> v[1001];
int n,x,y,z,m,a[1001][1001],tata[1001],viz[1001],b[1001][1001],i,j,flow,q[1001],cate;
int bfs()
    {
    int i,j;
    q[1]=1;
    for(i=1;i<=n;i++)
        viz[i]=0;
    viz[1]=1;
    int in=1,sf=1;
    while(in<=sf)
        {
        for(i=0;i<v[q[in]].size();i++)
            if(viz[v[q[in]][i]]==0&&a[q[in]][v[q[in]][i]]!=b[q[in]][v[q[in]][i]])
                {
                viz[v[q[in]][i]]=1;
                sf++;
                q[sf]=v[q[in]][i];
                tata[v[q[in]][i]]=q[in];
                if(v[q[in]][i]==n)
                    {
                    cate=in;
                    return 1;
                    }
                }
        in++;
        }
    return 0;
    }
int main ()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
    {
    scanf("%d%d%d",&x,&y,&z);
    a[x][y]=z;
    v[x].push_back(y);
    v[y].push_back(x);
    }
for(flow=0;bfs()!=0;)
    {
    int fmin=2000000000,nod;
    for(nod=n;nod!=1;nod=tata[nod])
        fmin=min(fmin,a[tata[nod]][nod]-b[tata[nod]][nod]);
    for(nod=n;nod!=1;nod=tata[nod])
        {
        b[tata[nod]][nod]+=fmin;
        b[nod][tata[nod]]-=fmin;
        }
    flow+=fmin;
    }
printf("%d",flow);
return 0;
}