Cod sursa(job #785679)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 9 septembrie 2012 17:18:24
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<bitset>
#include<string.h>
using namespace std;
struct coada {
	int sursa,y;
};
coada c[1001];
vector < pair <int,int> > v[1001];
vector <int> path;
int viz[1001];
int bfs(int nod, int s)
{
	int st,dr;
	coada x;
	st=1;
	dr=1;
	c[st].sursa=nod;
	c[st].y=nod;
	viz[nod]=1;
	while(st<=dr) {
		x=c[st];
		st++;
		for(vector < pair <int,int> > :: iterator it=v[x.y].begin();it!=v[x.y].end();it++) 
			if(viz[it->first]==0 && it->second) {
				viz[it->first]=1;
				dr++;
				c[dr].sursa=x.y;
				c[dr].y=it->first;
				if(it->first==s)
					return dr;
			}
	}
	return 0;
}
int main ()
{
	int n,m,i,x,y,capacity,fluxmax,flux,nr,sursa;
	ifstream f("maxflow.in");
	ofstream g("maxflow.out");
	f>>n>>m;
	for(i=1;i<=m;i++) {
		f>>x>>y>>capacity;
		v[x].push_back(make_pair(y,capacity));
	}
	f.close();
	fluxmax=0;
	while(1) {;
		memset(viz,0,sizeof(viz));
		nr=bfs(1,n);
		if(nr==0)
			break;
		sursa=c[nr].sursa;
		path.clear();
		path.push_back(n);
		nr--;
		while(nr>1) {
			if(c[nr].y==sursa) {
				path.push_back(sursa);
				sursa=c[nr].sursa;
			}
			nr--;
		}
		flux=(1<<30);
		sursa=1;
		for(vector <int> :: iterator it=path.end()-1;it!=path.begin();it--) {
			x=*it;
			for(vector < pair <int,int> > :: iterator itt=v[sursa].begin();itt!=v[sursa].end();itt++) 
				if(itt->first==x && itt->second) {
					if(itt->second<flux)
						flux=itt->second;
					break;
				}
			sursa=x;
		}
		x=*(path.begin());
		for(vector < pair <int,int> > :: iterator itt=v[sursa].begin();itt!=v[sursa].end();itt++) 
			if(itt->first==x && itt->second) {
				if(itt->second<flux)
					flux=itt->second;
				break;
			}
		sursa=1;
		for(vector <int> :: iterator it=path.end()-1;it!=path.begin();it--) {
			x=*it;
			for(vector < pair <int,int> > :: iterator itt=v[sursa].begin();itt!=v[sursa].end();itt++) 
				if(itt->first==x && itt->second) {
					itt->second=itt->second-flux;
					break;
				}
			sursa=x;
		}
		x=*(path.begin());
		for(vector < pair <int,int> > :: iterator itt=v[sursa].begin();itt!=v[sursa].end();itt++) 
			if(itt->first==x && itt->second) {
				itt->second=itt->second-flux;
				break;
			}
		sursa=x;
		fluxmax=fluxmax+flux;
	}
	g<<fluxmax;
	g.close();
	return 0;
}