Cod sursa(job #520362)

Utilizator ooctavTuchila Octavian ooctav Data 8 ianuarie 2011 10:56:32
Problema Paznici2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<deque>
#include<queue>
#include<set>
#include<vector>
using namespace std;

#define LL long long
#define II inline
#define pb push_back
#define fs first
#define ss second
#define all(c) c, c+GMAX
#define FORIT(it, v) for(it = v.begin() ; it != v.end() ; it++)

const int INF = 1000000005;
const int NMAX = 205;
const int GMAX = 2*NMAX + 2;

int N, S, D, REZ;

int cost[GMAX][GMAX];
vector<int> G[GMAX];
int F[GMAX][GMAX], C[GMAX][GMAX];
int dist[GMAX], tata[GMAX];

void citi()
{
	scanf("%d", &N);
	S = 0;
	D = 2*N + 1;
	for(int i = 1 ; i <= N ; i++)
		for(int j = N + 1; j <= 2 * N ; j++)
		{
			scanf("%d", &cost[i][j]);
			cost[j][i] = -cost[i][j];
			G[i].push_back(j);
			G[j].push_back(i);
			C[i][j] = 1;
		}
	for(int i = 1 ; i <= N ; i++)
	{
		G[i].push_back(S);
		G[S].push_back(i);
		C[S][i] = 1;
	}
	for(int j = N + 1; j <= 2 * N ; j++)
	{
		G[D].push_back(j);
		G[j].push_back(D);
		C[j][D] = 1;
	}
}

int BFS(int sursa)
{
	vector<int> :: iterator it;
	queue<int> Q;
	
	fill(all(dist), INF);
	fill(all(tata), 0);
	
	dist[sursa] = 0;
	Q.push(sursa);
	
	while(!Q.empty())
	{
		int x = Q.front();
		Q.pop();
		
		FORIT(it, G[x])
			if(F[x][*it] < C[x][*it] && dist[*it] > dist[x] + cost[x][*it])
			{
				dist[*it] = dist[x] + cost[x][*it];
				tata[*it] = x;
				Q.push(*it);
			}
	}
	
	return dist[D] != INF;
}

void flux()
{
	while(BFS(S))
	{
		for(int nod = D ; nod != S ; nod = tata[nod])
		{
			F[tata[nod]][nod]++, F[nod][tata[nod]]--;
			REZ += cost[tata[nod]][nod];
		}
	}
}

void scrie()
{
	printf("%d\n", REZ);
	for(int j = N + 1 ; j <= 2 * N ; j++)
	{
		BFS(j);
		int sol[NMAX] = {0};
		for(int i = 1 ; i <= N ; i++)
			if(cost[i][j] + dist[i] == 0)
				sol[++sol[0]] = i;
			
		for(int k = 0 ; k <= sol[0] ; k++)
			printf("%d ", sol[k]);
		printf("\n");
	}
}

int main()
{
	freopen("paznici2.in", "r", stdin);
	freopen("paznici2.out", "w", stdout);
	citi();
	flux();
	scrie();
	return 0;
}