Cod sursa(job #1497616)

Utilizator gobananaUPB-Farcasanu-Iancu-Poenaru gobanana Data 6 octombrie 2015 23:46:40
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <cstdio>
#include <algorithm>
#include <climits>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;

#define N_MAX 1002
#define M_MAX 10010
int F[N_MAX][N_MAX], C[N_MAX][N_MAX];
vector<int> G[N_MAX];
pair<int, int> muchii[M_MAX];
int T[N_MAX];
bool viz[N_MAX], viz2[N_MAX];
int n, m;

bool bfs() {
	queue<int> q;
	memset(viz, 0, sizeof(viz));
	q.push(1);
	viz[1] = true;
	while(!q.empty()) {
		int x = q.front();
		q.pop();
		if (x == n) {
			continue;
		}
		for(vector<int>::iterator it = G[x].begin(); it != G[x].end(); it++) {
			if (!viz[*it] && F[x][*it] != C[x][*it]) {
				viz[*it] = true;
				T[*it] = x;
				q.push(*it);
			}
		}
	}
	return viz[n];
}

void bfs2(int s, bool viz[]) {
	memset(viz, 0, sizeof(viz[0]) * N_MAX);
	queue<int> q;
	q.push(s);
	viz[s] = true;
	while (!q.empty()) {
		int x = q.front();
		q.pop();

		for (vector<int>::iterator it = G[x].begin(); it != G[x].end(); it++) {
			int y = *it;
			if (F[x][y] == C[x][y] || F[y][x] == C[y][x] || viz[y]) {
				continue;
			}
			viz[y] = true;
			q.push(y);
		}
	}
}

void flux() {

	while (bfs()) {
		for(vector<int>::iterator it = G[n].begin(); it != G[n].end(); it++) {
			if (F[*it][n] != C[*it][n] && viz[*it]) {
				T[n] = *it;

				int fl = INT_MAX;
				for (int x = n; x != 1; x = T[x]) {
					fl = min(fl, C[T[x]][x] - F[T[x]][x]);
				}

				for (int x = n; x != 1; x = T[x]) {
					F[T[x]][x] += fl;
					F[x][T[x]] -= fl;
				}
			}
		}
	}

	bfs2(1, viz);
	bfs2(n, viz2);

	vector<int> sol;

	for (int i = 1; i <= m; i++) {
		//printf("%d %d %d\n", muchii[i].first, muchii[i].second, F[muchii[i].first][muchii[i].second]);
		for (int j = 0; j < 2; j++) {
			int x = muchii[i].first, y = muchii[i].second;
			if (j == 1) {
				swap(x, y);
			}
			if (C[x][y] == F[x][y] && viz[x] && !viz[y] && viz2[y] && !viz2[x]) {
				sol.push_back(i);
				break;
			}
		}
	}
	printf("%d\n", (int)sol.size());
	for (int i = 0; i < (int)sol.size(); i++) {
		printf("%d\n", sol[i]);
	}
}

void solve() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= m; i++) {
		int x, y, c;
		scanf("%d%d%d", &x, &y, &c);
		G[x].push_back(y);
		G[y].push_back(x);

		C[x][y] = c;
		C[y][x] = c;
		muchii[i] = make_pair(x, y);
	}

	flux();
}

int main() {
	freopen("critice.in", "r", stdin);
	freopen("critice.out", "w", stdout);

	solve();

	return 0;
}