Cod sursa(job #1153280)

Utilizator teoionescuIonescu Teodor teoionescu Data 25 martie 2014 13:03:17
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include<fstream>
#include<cstring>
#include<vector>
#include<queue>
#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],Gg[Nmax];
int pred[Nmax],fr[Nmax];
int C[Nmax][Nmax],c[Nmax][Nmax];
int N,M;
queue<int> q;
int bfs(){
    while(!q.empty()) q.pop();
    memset(pred,0,sizeof(pred));
    q.push(1);
    pred[1]=-1;
    while(!q.empty()){
        int x=q.front(); q.pop();
        if(fr[x] && c[x][N]<C[x][N]){
            pred[N]=x;
            return 1;
        }
        for(vector<int>::iterator it=G[x].begin();it!=G[x].end();++it){
            if(!pred[*it] && c[x][*it]<C[x][*it]){
                pred[*it]=x;
                q.push(*it);
            }
        }
        for(vector<int>::iterator it=Gg[x].begin();it!=Gg[x].end();++it){
            if(!pred[*it] && c[x][*it]<C[x][*it]){
                pred[*it]=x;
                q.push(*it);
            }
        }
    }
    return 0;
}
int addpath(){
    int y=N,Min=1<<30;
    while(y!=1){
        Min=min(Min,C[pred[y]][y]-c[pred[y]][y]);
        y=pred[y];
    }
    y=N;
    while(y!=1){
        c[pred[y]][y]+=Min;
        c[y][pred[y]]-=Min;
        y=pred[y];
    }
    return Min;
}
int main(){
    in>>N>>M;
    for(int i=1;i<=M;i++){
        int x,y,z;
        in>>x>>y>>z;
        G[x].push_back(y);
        Gg[y].push_back(x);
        if(y==N) fr[x]=1;
        C[x][y]=z; c[x][y]=0;
        C[y][x]=0; c[y][x]=0;
    }
    int MF=0;
    while(bfs()) MF+=addpath();
    out<<MF<<'\n';
    return 0;
}