Cod sursa(job #2076663)

Utilizator adystar00Bunea Andrei adystar00 Data 26 noiembrie 2017 21:51:53
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int N = 1010;
const int inf = 200000000;
int seen[N],q[N],flow[N][N],capacity[N][N],dad[N],n;
vector <int> g[N];
int bfs ()
{
    int start,finish,a,i,node,add;
    q[1]=1;
    start=1;
    finish=1;
    seen[1]=1;
    memset(seen,0,sizeof(seen));
    while(start<=finish)
    {
        node=q[start];
        start++;
        if(node==n)
            continue;
        a=g[node].size();
        for(i=0;i<a;i++)
        {
            if(seen[g[node][i]]==1||capacity[node][g[node][i]]==flow[node][g[node][i]])
                continue;
            seen[g[node][i]]=1;
            finish++;
            q[finish]=g[node][i];
            dad[g[node][i]]=node;
        }
    }
    return seen[n];
}
int main()
{
    ifstream fin ("maxflow.in");
    ofstream fout ("maxflow.out");
    int m,i,j,x,y,a,b,c,add,node,maxflow=0;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        g[x].push_back(y);
        g[y].push_back(x);
        capacity[x][y]+=c;
    }
    while(bfs()==1)
    {
        a=g[n].size();
        for(i=0;i<a;i++)
        {
            node=g[n][i];
            if(flow[node][n]==capacity[node][n]||seen[node]==0)
                continue;
            add=inf;
            dad[n]=node;
            for(node=n;node!=1;node=dad[node])
                add=min(add,(capacity[dad[node]][node]-flow[dad[node]][node]));
            if(add==0)
                continue;
            for(node=n;node!=1;node=dad[node])
            {
                flow[dad[node]][node]+=add;
                flow[node][dad[node]]-=add;
            }
            maxflow+=add;
            //cout<<maxflow<<" ";
        }
    }
    fout<<maxflow;
    return 0;
}