Cod sursa(job #968157)

Utilizator dropsdrop source drops Data 1 iulie 2013 20:41:38
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <bitset>
#include <queue>
#include <deque>
#include <list>
#include <set>
#include <ctime>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
ifstream ff("maxflow.in");
ofstream gg("maxflow.out");
#define max 1011
vector<int> vv[max];
int n, m, cc[max][max], rr[max][max], tt[max], qq[max];
bool ww[max];

bool bfs(){
	int p, u, x, y, l;
	qq[p=u=0]=1;
	memset(ww,0,sizeof(ww));
	ww[1]=1;
	while(p<=u){
		x=qq[p++];
		if(x==n) continue;
		l=vv[x].size();
		for(int i=0;i<l;i++){
			y=vv[x][i];
			if(!ww[y] && rr[x][y]<cc[x][y]){
				ww[y]=1;
				tt[y]=x;
				qq[++u]=y;
			}
		}
	}
	return ww[n];
}

void flu(){
	int y, l, s, c;
	s=0;
	while(bfs()){
		l=vv[n].size();
		for(int i=0;i<l;i++){
			y=vv[n][i];
			if(ww[y] && rr[y][n]<cc[y][n]){
				tt[n]=y;
				c=0xfffffff;
				for(int x=n;x!=1;x=tt[x])
					c=min(c, cc[tt[x]][x]-rr[tt[x]][x]);
				if(c!=0){
					for(int x=n;x!=1;x=tt[x]){
						rr[tt[x]][x] += c;
						rr[x][tt[x]] -= c;
					}
					s+=c;
				}
			}
		}
	}
	gg << s << "\n";
}

int main(){
	int a,b,c;
	ff >> n >> m;
	for(int i=0;i<m;i++){
		ff >> a >> b >> c;
		vv[a].push_back(b);
		vv[b].push_back(a);
		cc[a][b] = c;
	}
	flu();
}