// 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