Cod sursa(job #571220)

Utilizator cdascaluDascalu Cristian cdascalu Data 4 aprilie 2011 10:20:49
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define MAX 205
#define INF 0x3f3f3f
#define SHIFT 101
using namespace std;
int N,C[MAX][MAX],F[MAX][MAX],T[MAX],dist[MAX],in[MAX];
vector< pair<int,int> > G[MAX];
queue<int> Q;
void read()
{
	ifstream f("cc.in");
	f>>N;
	int i,j,x;
	for(i=1;i<=N;++i)
		for(j=1;j<=N;++j)
		{
			f>>x;
			G[i].push_back(make_pair(SHIFT+j, x));
			G[SHIFT+j].push_back(make_pair(i, -x));
			C[i][SHIFT+j] = 1;
		}
	f.close();
	for(i=1;i<=N;++i)
	{
		C[0][i] = 1;
		G[0].push_back(make_pair(i,0));
		G[i].push_back(make_pair(0,0));
		C[SHIFT+i][SHIFT+N+1] = 1;
		G[SHIFT+i].push_back(make_pair(SHIFT+N+1, 0));
		G[SHIFT+N+1].push_back(make_pair(SHIFT+i, 0));
	}
}
int bf()
{
	for(int i=1;i<=SHIFT+N+1;++i)
		dist[i] = INF;
	int nod;
	Q.push(0);
	dist[0] = 0;
	in[0] = 1;
	vector< pair<int,int> >::iterator it;
	int vec,c;
	while(!Q.empty())
	{
		nod = Q.front();
		Q.pop();
		in[nod] = 0;
		if(nod == SHIFT+N+1)continue;
		for(it = G[nod].begin();it!=G[nod].end();++it)
		{
			vec = it->first;
			c = it->second;
			if(dist[nod] + c < dist[vec] && C[nod][vec] > F[nod][vec])
			{
				dist[vec] = dist[nod] + c;
				T[vec] = nod;
				if(!in[vec])
				{
					in[vec] = 1;
					Q.push(vec);
				}
			}
		}
	}
	if(dist[SHIFT+N+1] != INF)return 1;
	return 0;
}
int main()
{
	read();
	int r,cost=0,i;
	while(bf())
	{
		
		i = SHIFT+N+1;
		r = INF;
		while(i)
		{
			r = min(r,C[T[i]][i] - F[T[i]][i]);
			i = T[i];
		}
		i = SHIFT+N+1;
		while(i)
		{
			F[T[i]][i] += r;
			F[i][T[i]] -= r;
			i = T[i];
		}
		cost += r*dist[SHIFT+N+1];
	}
	ofstream g("cc.out");
	g<<cost<<"\n";
	g.close();
	return 0;
}