Cod sursa(job #2204040)

Utilizator PhilipDumitruPhilip Dumitru PhilipDumitru Data 14 mai 2018 10:54:12
Problema Taramul Nicaieri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>

#define INF 0x4fffffff

using namespace std;

vector<int> adjacentList[1001];

int capacity[1001][1001];
int flow[1001][1001];
int cameFrom[1001];
char visited[1002];
int n, memset_size, dest;
long long int totalFlow;

short bfs()
{
	int i;
	memset(visited, 0, memset_size);
	visited[1] = 1;
	queue<int> q;
	vector<int>::iterator it, it_end;
	q.push(1);
	while (!q.empty())
	{
		i = q.front();
		q.pop();
		if (i == dest) continue;
		for (it = adjacentList[i].begin(), it_end = adjacentList[i].end(); it != it_end; ++it)
		{
			if (!visited[*it] && capacity[i][*it] > flow[i][*it])
			{
				visited[*it] = 1;
				cameFrom[*it] = i;
				q.push(*it);
			}
		}
	}

	return visited[dest];
}

int main()
{
	FILE *fin = fopen("harta.in", "r");
	FILE *fout = fopen("harta.out", "w");

	int m, i, j, x, y, _n;
	fscanf(fin, "%d", &n);
	dest = 2 * n + 2;
	memset_size = sizeof(char) * (dest + 1);

	_n = n + 1;
	for (i = 2; i <= _n; ++i)
	{
		fscanf(fin, "%d %d", &x, &y);
		adjacentList[1].push_back(i);
		adjacentList[i].push_back(1);
		adjacentList[dest].push_back(i+n);
		adjacentList[i+n].push_back(dest);
		capacity[1][i] = x;
		capacity[i+n][dest] = y;
	}

	for (i = 2; i <= _n; ++i)
	{
		for (j = 2; j <= _n; ++j)
		{
			if (i != j) {
				adjacentList[i].push_back(j+n);
				adjacentList[j+n].push_back(i);
				capacity[i][j+n] = 1;
			}
		}
	}
	vector<int>::iterator it, it_end;

	while (bfs())
	{
		for (it = adjacentList[dest].begin(), it_end = adjacentList[dest].end(); it != it_end; ++it)
		{
			if (visited[*it] && capacity[*it][dest] > flow[*it][dest])
			{
				j = INF;
				cameFrom[dest] = *it;
				for (i = dest; i > 1; i = cameFrom[i])
				{
					if (j > capacity[cameFrom[i]][i] - flow[cameFrom[i]][i])
						j = capacity[cameFrom[i]][i] - flow[cameFrom[i]][i];
				}
				if (j)
				{
					for (i = dest; i > 1; i = cameFrom[i])
					{
						flow[cameFrom[i]][i] += j;
						flow[i][cameFrom[i]] -= j;
					}
					totalFlow += j;
				}
			}
		}
	}
	fprintf(fout, "%lld\n", totalFlow);
	fprintf(stdout, "%lld\n", totalFlow);

	for (i = 2; i <= _n; ++i)
	{
		for (j = 2+n; j < dest; ++j)
		{
			if (flow[i][j]) {
				fprintf(fout, "%d %d\n", i-1, j - _n);
			}
		}
	}


	fclose(fin);
	fclose(fout);
	return 0;
}