Cod sursa(job #1170223)

Utilizator teoionescuIonescu Teodor teoionescu Data 12 aprilie 2014 22:28:37
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>
#define abs(x) ((x>0)?(x):(-(x)))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int Nmax = 1005;
vector<int> G[Nmax];
int C[Nmax][Nmax];
int pred[Nmax];
int N,M;
queue<int> q;
int bfs(){
    memset(pred,0,sizeof(pred)); pred[1]=1;
    q.push(1);
    while(!q.empty()){
        int x=q.front(); q.pop();
        for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it){
            if(!pred[*it] && abs(C[x][*it])){
                pred[*it]=x;
                q.push(*it);
            }
        }
    }
    return pred[N]!=0;
}
int Maxflow(){
    int MF=0;
    while(bfs()){
        for(vector<int>::iterator it=G[N].begin();it!=G[N].end();++it){
            if(pred[*it]){
                int x=*it;
                int Min=C[x][N];
                while(x!=1){
                    Min=min(Min, abs(C[pred[x]][x]) ),x=pred[x];
                    if(!Min) break;
                }
                if(Min){
                    MF+=Min;
                    x=*it;
                    C[x][N]-=Min;
                    C[N][x]+=Min;
                    while(x!=1){
                        C[pred[x]][x]-=Min;
                        C[x][pred[x]]+=Min;
                        x=pred[x];
                    }
                }
            }
        }
    }
    return MF;
}
int main(){
    in>>N>>M;
    for(int i=1;i<=M;i++){
        int x,y,z;
        in>>x>>y>>z;
        C[x][y]=z;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    out<<Maxflow()<<'\n';
    return 0;
}