Cod sursa(job #1192404)

Utilizator hellol30FMI Macovei Daniel hellol30 Data 28 mai 2014 22:15:25
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
vector< vector<int> > vecini;
int maxflow[1002][1002], flow[1002][1002];
vector< int > t;
bool viz[1002];
int n,m;
bool bfs(){
	int nod;
	queue <int> Q;
	memset(viz,0,sizeof(viz));
    for(Q.push(1);!Q.empty();) {
        nod=Q.front(); Q.pop();
        for(vector<int>::iterator it=vecini[nod].begin();it!=vecini[nod].end();it++) {
            if(!viz[*it] && flow[nod][*it]!=maxflow[nod][*it]) {
                t[*it]=nod;
                viz[*it]=true;
                if(*it!=n)
                    Q.push(*it);
            }
        }
    }
    return viz[n];
}
int main() {
	freopen("maxflow.in","rt",stdin);
	freopen("maxflow.out","wt",stdout);
    int x, y;
    scanf("%d%d",&n,&m);
	t.assign(n+1,0);
	vecini.assign(n+1,t);
    for(register int i=0; i<m; i++) {
        scanf("%d%d",&x,&y);
        vecini[x].push_back(y);
        vecini[y].push_back(x);
        scanf("%d",&maxflow[x][y]);
    }
    int minim, flowcost=0 ;
    while( bfs() ) {
        for(vector<int>::iterator it=vecini[n].begin();it!=vecini[n].end();it++) {
            t[n]=*it;
            if(!viz[*it] || flow[*it][n]==maxflow[*it][n])
                continue;
            minim=1<<30;
            for(register int i=n; i!=1 ; i=t[i])
                minim=min(minim, maxflow[t[i]][i]-flow[t[i]][i]);
            for(register int i=n;i!=1;i=t[i]) {
                flow[i][t[i]]-=minim;
                flow[t[i]][i]+=minim;
            }
            flowcost+=minim;
        }
    }
    printf("%d\n",flowcost);
	return 0;
}