Cod sursa(job #988786)

Utilizator classiusCobuz Andrei classius Data 23 august 2013 21:11:50
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#define sd (v[i][j])
using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

int n,m;
vector<int> v[1001];
int a[1001][1001];

bool bfs(int parent[],int son[]){

    queue<int> q;
    q.push(1);

    bool ok[1001]={};
    ok[1]=1;
    son[0]=0;

    while(!q.empty()){
        int i=q.front();
        q.pop();
        for(unsigned j=0;j<v[i].size();j++){
            if(!ok[sd] && a[i][sd] > 0 && sd!=n){
                ok[sd]=1;
                parent[sd]=i;
                q.push(sd);
            }
            if(sd==n && a[i][sd] > 0){
                son[++son[0]]=i;
                ok[n]=1;
            }
        }
    }

    return ok[n];
}

int max_flow(){

    int parent[1001],son[1001];
    int s=0;

    while(bfs(parent,son)){

        for(int t=1;t<=son[0];t++){

            int ds=son[t];

            int flo=a[ds][n];
            int u=ds,ve;
            while(u!=1){
                ve=u;
                u=parent[u];
                flo=min(flo,a[u][ve]);
            }

            u=ds;
            while(u!=1){
                ve=u;
                u=parent[u];
                a[u][ve]-=flo;
                a[ve][u]+=flo;
            }

            a[ds][n]-=flo;
            a[n][ds]+=flo;

            s+=flo;
        }
    }

    return s;
}

int main()
{
    f>>n>>m;

    for(int i=1;i<=m;i++){
        int x,y,flo;
        f>>x>>y>>flo;
        a[x][y]=flo;
        v[x].push_back(y);
        v[y].push_back(x);
    }

    g<<max_flow();

    return 0;
}