Cod sursa(job #1542058)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 4 decembrie 2015 22:21:17
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<cstdio>
#include<cstring>
#include<vector>
#define inf 200000000
using namespace std;
int capacity[1010][1010],flow[1010][1010],seen[1010],dad[1010],q[1010],n;
vector<int> g[1010];
int minim(int a,int b){
    if(a<b)
        return a;
    return b;
}
int bfs(){
    int start=1,finish=1,node,i;
    memset(seen,0,sizeof(seen));
    q[1]=1;
    seen[1]=1;
    while(start<=finish){
        node=q[start];
        start++;
        if(node==n)
            continue;
        for(i=0;i<g[node].size();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(){
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int m,maxflow=0,add,i,a,b,c,node;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d%d",&a,&b,&c);
        capacity[a][b]+=c;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    while(bfs()==1)
        for(i=0;i<g[n].size();i++){
            node=g[n][i];
            if(flow[node][n]==capacity[node][n]||seen[node]==0)
                continue;
            dad[n]=node;
            add=inf;
            for(node=n;node!=1;node=dad[node])
                add=minim(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;
        }
    printf("%d",maxflow);
    return 0;
}