// 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;
}
Monday, March 7, 2016
UVa 11686 - Pick up sticks
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment