Cod sursa(job #959173)

Utilizator raulstoinStoin Raul raulstoin Data 8 iunie 2013 09:59:07
Problema Nowhere-zero Scor 0
Compilator cpp Status done
Runda Infoarena Cup 2013 Marime 1.46 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>

#define NMAX 1005
#define INF 2000000

using namespace std;

int C[NMAX][NMAX],F[NMAX][NMAX],flow,TT[NMAX],n,m,use[NMAX];
vector <int> G[NMAX];
queue<int> Q;

void read()
{
	
	ifstream fin("nowhere-zero.in");
	fin>>n>>m;
	double x;
	for(int i=0;i<2*n;i++)
		fin>>x;
	for(int x,y,i=1;i<=m;i++)
	{
		fin>>x>>y;
		G[x].push_back(y);
		G[y].push_back(x);
		C[x][y]=5;
	}
}

bool BFS()
{
	Q.push(1);
	memset(use,0,sizeof(use));
	use[1]=1;
	while(!Q.empty())
	{
		int nod=Q.front();Q.pop();
		if(nod==n)
			continue;
		for(unsigned int i=0;i<G[nod].size();i++)
		{
			int vec=G[nod][i];
			if(use[vec] || C[nod][vec]==F[nod][vec])
				continue;
			use[vec]=1;
			Q.push(vec);
			TT[vec]=nod;
		}
	}
	return use[n];
}

void solve()
{
	int fmin,nod,vec;
	for(;BFS();)
		for(size_t i=0;i<G[n].size();i++)
		{
			vec=G[n][i];
			if(!use[vec] || (C[vec][n]==F[vec][n]))
				continue;
			TT[n]=vec;
			fmin=INF;
			for(nod=n;nod!=1;nod=TT[nod])
				fmin=min(fmin,C[TT[nod]][nod]-F[TT[nod]][nod]);
			for(nod=n;nod!=1;nod=TT[nod])
			{
				F[TT[nod]][nod]+=fmin;
				F[nod][TT[nod]]-=fmin;
			}
			flow+=fmin;
		}
}

void print()
{
	ofstream fout("nowhere-zero.out");
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(C[i][j])
				fout<<i<<' '<<j<<' '<<F[i][j]<<'\n';
	fout.close();
}

int main()
{
	read();
	solve();
	print();
	return 0;
}