Cod sursa(job #1649461)

Utilizator TrascaAndreiTrasca Andrei TrascaAndrei Data 11 martie 2016 13:45:55
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
#include <string.h>

using namespace std;

const int N = 1005;
const int INF = 999999999;

vector<int> a[N];
queue<int> q;

int n,m,f[N][N],c[N][N],t[N],s,d,flux;

bool bfs()
{
    int ok=0,k,i;
    q.push(s);
    memset(t,0,sizeof t);
    t[s]=-1;
    while(!q.empty())
    {
        k=q.front();
        q.pop();
        for(i=0;i<a[k].size();i++)
            if(t[a[k][i]]==0 && f[k][a[k][i]]<c[k][a[k][i]])
                if(a[k][i]==d)
                    ok=1;
                else
                    t[a[k][i]]=k,q.push(a[k][i]);
    }
    return ok;
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d %d",&n,&m);
    int i,j,x,y,z,minn;
    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        a[x].push_back(y);
        a[y].push_back(x);
        c[x][y]=z;
    }
    s=1;d=n;
    while(bfs())
        for(i=0;i<a[d].size();i++)
        {
            minn=INF;
            x=a[d][i];
            if(t[x] && f[x][d]<c[x][d])
            {
                t[d]=x;
                for(j=d;j!=s;j=t[j])
                    minn=min(minn,c[t[j]][j]-f[t[j]][j]);
                if(minn<=0)
                    continue;
                flux+=minn;
                for(j=d;j!=s;j=t[j])
                {
                    f[t[j]][j]+=minn;
                    f[j][t[j]]-=minn;
                }
            }
        }
    printf("%d\n",flux);
    return 0;
}