Pagini recente » Cod sursa (job #2757743) | Cod sursa (job #281968) | Cod sursa (job #69238) | Cod sursa (job #692524) | Cod sursa (job #2204040)
#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;
}