Cod sursa(job #970916)

Utilizator tudorv96Tudor Varan tudorv96 Data 8 iulie 2013 00:38:54
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <vector>
#include <set>
#include <queue>
#include <list>
#include <fstream>
using namespace std;
  
#define min(a, b) ((a < b) ? a : b)
#define X first
#define Y second
  
typedef short sh;
typedef pair <sh, sh> muchie;
typedef pair <muchie, sh> complet;
  
ifstream fin ("critice.in");
ofstream fout ("critice.out");
  
vector <set <sh> > g;
vector <vector <sh> > f, c;
list <muchie> sol;
vector <sh> t, viz;
vector <bool> s, d;
queue <sh> Q;
vector <sh> res;
vector <complet> M;
sh n, m, vizit;
  
void bfsopt(vector <bool> :: iterator F0) {
	while (Q.size()) {
	sh x = Q.front();
		Q.pop();
		for (set <sh> :: iterator it = g[x].begin(); it != g[x].end(); ++it)
		if (!(*(F0 + *it))) {
			Q.push(*it);
			*(F0 + *it) = 1;
		}
	}
}
  
int bfs() {
	Q.push(1);
	viz[1] = vizit;
	while (Q.size() && viz[n] != vizit) {
		sh x = Q.front();
		Q.pop();
		for (set <sh> :: iterator it = g[x].begin(); it != g[x].end(); ++it)
			if (viz[*it] != vizit && f[x][*it] < c[x][*it]) {
				Q.push(*it);
				viz[*it] = vizit;
				t[*it] = x;
			}
	}
	while (Q.size())
		Q.pop();
	return viz[n];
} 
  
void Resizeall(int x) {
	t.resize(x);
	f.resize(x); c.resize(x);
	viz.resize(x); g.resize(x);
	s.resize(x); d.resize(x);
	for (int i = 1; i < x; ++i)
		f[i].resize(x), c[i].resize(x);
}
  
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].insert(y);
		g[y].insert(x);
		c[x][y] = c[y][x] = z;
		M.push_back (complet (muchie (x, y), i));
	}
	fin.close();
	while (++vizit == bfs()) {
		int MIN = 1 << 28;
		for (int i = n; i != 1; i = t[i])
			MIN = min(c[t[i]][i] - f[t[i]][i], MIN);
		for (int i = n; i != 1; i = t[i]) {
			f[t[i]][i] += MIN;
			f[i][t[i]] -= MIN;
			if (f[t[i]][i] == c[t[i]][i] || f[i][t[i]] == c[i][t[i]]) {
				g[i].erase(t[i]);
				g[t[i]].erase(i);
			}
		}
	}
	Q.push(1);
	s[1] = 1;
	bfsopt(s.begin());
	Q.push(n);
	d[n] = 1;
	bfsopt(d.begin());
	for (vector <complet> :: iterator it = M.begin(); it != M.end(); ++it) {
		int x = (*it).X.X, y = (*it).X.Y, z = (*it).Y;
		if (g[x].find (y) == g[x].end())
			if ((s[x] && d[y] && !d[x] && !s[y]) || (s[y] && d[x] && !s[x] && !d[y]))
			res.push_back(z);
	}
	fout << res.size() << "\n";
	for (vector <sh> :: iterator it = res.begin(); it != res.end(); ++it)
		fout << *it << "\n";
	return 0;
}