Cod sursa(job #1376618)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 5 martie 2015 18:05:56
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int min2(int a,int b){
    if(a<b)
        return a;
    return b;
}
int max2(int a,int b){
    if(a>b)
        return a;
    return b;
}
const int N=1000,INF=110000;
int cap[N+1][N+1];
vector<int>g[N+1];
int can[N+1][N+1];
int father[N+1];
int dist[N+1];
int q[N+1];
bool vis[N+1];
int n,m;
void bfs(){
    int l=1,r=1;
    q[1]=1;
    memset(vis,0,sizeof(vis));
    vis[1]=true;
    while(l<=r){
        int dad=q[l++];
        for(unsigned int j=0;j<g[dad].size();j++){
            int i=g[dad][j];
            if(i==n)
                continue;
            if(!vis[i])
                if(can[dad][i]){
                    q[++r]=i;
                    vis[i]=true;
                    father[i]=dad;
                }
        }
    }
}
int f;
void update(int node){
    int start=node;
    f=can[node][n];
    while(node!=1){
        f=min2(f,can[father[node]][node]);
        node=father[node];
    }
    node=start;
    while(node!=1){
        can[father[node]][node]-=f;
        can[node][father[node]]+=f;
        node=father[node];
    }
    can[start][n]-=f;
}
int main(){
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        cap[x][y]=z;
        can[x][y]=z;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    int flow=0;
    bool flag=true;
    while(flag){
        flag=false;
        bfs();
        for(unsigned int j=0;j<g[n].size();j++){
            int i=g[n][j];
            if(can[i][n])
                if(vis[i]){
                    update(i);
                    flow+=f;
                    if(f)
                        flag=true;
                }
        }
    }
    printf("%d",flow);
    return 0;
}