Monday, March 7, 2016

UVa 11686 - Pick up sticks

// UVa 11686 - Pick up sticks

#include <iostream>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std;

#define integer unsigned int

struct edge {
	integer a, b;
};

bool operator <(edge x, edge y) {
	return x.a < y.a || (x.a == y.a && x.b < y.b);
}

integer parents[1000001];
vector<edge> lnk;
integer ini[1000001], fin[1000001];
vector<integer> s;

int main() {
	integer n, m;
	cin >> n >> m;
	while (n || m) {
		memset(parents, 0, sizeof(parents));
		lnk.clear();
		for (int i = 0; i < m; i++) {
			integer a, b;
			cin >> a >> b;
			lnk.push_back( { a, b });
			parents[b]++;
		}
		sort(lnk.begin(), lnk.end());

		memset(ini, 255, sizeof(ini));
		memset(fin, 0, sizeof(fin));
		integer oo = ini[0];
		ini[lnk[0].a] = 0;
		for (int i = 1; i < m; i++)
			if (lnk[i].a != lnk[i - 1].a) {
				ini[lnk[i].a] = i;
				fin[lnk[i - 1].a] = i - 1;
			}
		fin[lnk[m - 1].a] = m - 1;

		s.clear();
		// sort topologically
		for (integer i = 1; i <= n; i++)
			if (parents[i] == 0)
				s.push_back(i);
		integer now = 0;
		while (now < s.size()) {
			for (integer i = ini[s[now]]; i <= fin[s[now]]; i++) {
				parents[lnk[i].b]--;
				if (parents[lnk[i].b] == 0)
					s.push_back(lnk[i].b);
			}
			now++;
		}
		if (s.size() != n)
			cout << "IMPOSSIBLE" << endl;
		else {
			for (integer i = 0; i < n; i++)
				cout << s[i] << endl;
		}
		cin >> n >> m;
	}
	return 0;
}

No comments:

Post a Comment