Cod sursa(job #970879)

Utilizator tudorv96Tudor Varan tudorv96 Data 7 iulie 2013 23:35:13
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <vector>
#include <list>
#include <fstream>
#include <iostream>
#include <queue>
#include <iostream>
using namespace std;

typedef short sh;
typedef pair <sh, sh> muchie;
typedef pair <muchie, sh> complet;

ifstream fin ("critice.in");
ofstream fout ("critice.out");

#define min(a, b) ((a < b) ? a : b)

vector <list <sh> > g;
vector <vector <sh> > f, c;
vector <sh> t, viz;
queue <sh> Q;
vector <bool> s, d;
vector <complet> M;
vector <int> res;
int n, m, vizit;

int bfs() {
	Q.push(1);
	viz[1] = vizit;
	while (Q.size() && viz[n] != vizit) {
		int x = Q.front();
		Q.pop();
		for (list <sh> :: iterator it = g[x].begin(); it != g[x].end(); ++it) 
			if (viz[*it] != vizit && f[x][*it] < c[x][*it] && c[x][*it] > 0) {
				Q.push(*it);
				viz[*it] = vizit;
				t[*it] = x;
			}
	}
	while (Q.size())
		Q.pop();
	return viz[n];
}

void resizeall(int x) {
	g.resize(x);
	f.resize(x); c.resize(x);
	t.resize(x); viz.resize(x);
	s.resize(x); d.resize(x);
	M.resize(m);
	res.reserve(m);
	for (int i = 1; i < x; ++i)
		c[i].resize(x), f[i].resize(x);
}

void bfs2(vector <bool> :: iterator F0) {
	while (Q.size()) {
		int x = Q.front();
		Q.pop();
		for (int i = 1; i <= n; ++i)
			if (c[x][i] && !(*(F0 + i))) {
				*(F0 + i) = 1;
				Q.push(i);
			}
	}
}

int main() {
	fin >> n >> m;
	resizeall(n+1);
	for (int i = 1; i <= m; ++i) {
		int x, y, z;
		fin >> x >> y >> z;
		g[x].push_back (y);
		g[y].push_back (x);
		c[x][y] = c[y][x] = z;
		M.push_back (complet(muchie (x, y), i));
	}
	fin.close();
	while (++vizit == bfs())
		for (int i = 1; i < n; ++i) 
			if (f[i][n] < c[i][n]) {
				int MIN = c[i][n] - f[i][n];
				for (int x = i; x != 1; x = t[x])
					MIN = min (c[t[x]][x] - f[t[x]][x], MIN);
				for (int x = i; x != 1; x = t[x]) {
					f[t[x]][x] += MIN;
					f[x][t[x]] -= MIN;
					if (c[t[x]][x] == f[t[x]][x])
						c[t[x]][x] = c[x][t[x]] = 0;
				}
				f[i][n] += MIN;
				f[n][i] -= MIN;
				if (c[i][n] == f[i][n])
					c[i][n] = c[n][i] = 0;
			}
	Q.push(1);
	s[1] = 1;
	bfs2(s.begin());
	Q.push(n);
	d[n] = 1;
	bfs2(d.begin());
	for (vector <complet> :: iterator it = M.begin(); it != M.end(); ++it) {
		int x = (*it).first.first, y = (*it).first.second, c = (*it).second;
		if ((s[x] && !s[y] && !d[x] && d[y]) || (s[y] && !s[x] && !d[y] && d[x]))
			res.push_back (c);
	}
	fout << res.size() << "\n";
	for (vector <int> :: iterator it = res.begin(); it != res.end(); ++it)
		fout << *it << "\n";
}