#include <cstdio> #include <vector> #define REP(i,n) for(int i=0; i<n; i++) #define FOR(i,b,e) for(int i=b; i<=e; i++) #define FORD(i,b,e) for(int i=b; i>=e; i--) #define PB push_back using namespace std; typedef vector <int> VI; typedef vector < VI > VVI; typedef pair<int, int> PII; VVI G, TRANS, NO, GU; int partID; int out[10009], no[10009], part[10009], parent[10009]; void dfs(int s, int p){ if(part[s] != -1 || parent[s] != -2) return; part[s] = p; REP(i, GU[s].size()){ dfs(GU[s][i], p); } return; } bool partition(VI & nodes){ partID = 0; REP(i,nodes.size()) part[nodes[i]] = -1; REP(i,nodes.size()){ if(part[nodes[i]] == -1 && parent[nodes[i]] == -2){ dfs(nodes[i],partID); partID++; } } } int getBoss(VI & nodes){ REP(i, nodes.size()) no[nodes[i]] = 0; REP(i, nodes.size()) REP(j, NO[nodes[i]].size()) no[ NO[nodes[i]][j] ]++; REP(i, nodes.size()){ if(out[nodes[i]] == 0 && no[nodes[i]] == 0) return nodes[i]; } return -1; } int fix(int node, int par){ REP(i, TRANS[node].size()){ out[TRANS[node][i]]--; } part[node] = -1; parent[node] = par; } bool process(VI& nodes, int root){ int ceo = getBoss(nodes); if(ceo == -1) return false; fix(ceo, root); if(nodes.size() == 1){ return true; } partition(nodes); VVI parts; parts.resize(partID); REP(i,nodes.size()){ if(nodes[i]==ceo) continue; parts[part[nodes[i]]].PB(nodes[i]); } REP(i, parts.size()){ if( !process(parts[i], ceo) ) return false; } return true; } int main(){ int n,m,b,e; char c; scanf("%d %d", &n, &m); REP(i,n){ parent[i] = -2; part[i] = -1; } G.resize(n); TRANS.resize(n); NO.resize(n); GU.resize(n); REP(i,m){ scanf("%d %d %c", &b, &e, &c); b--; e--; if(c == 'T'){ out[b]++; G[b].PB(e); GU[b].PB(e); GU[e].PB(b); TRANS[e].PB(b); } else{ NO[b].PB(e); no[e]++; } } VI init; init.resize(n); REP(i,n) init[i] = i; if( ! process(init, -1) ){ printf( "NIE\n"); } else{ REP(i,n){ printf("%d\n", parent[i] + 1); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #include <cstdio> #include <vector> #define REP(i,n) for(int i=0; i<n; i++) #define FOR(i,b,e) for(int i=b; i<=e; i++) #define FORD(i,b,e) for(int i=b; i>=e; i--) #define PB push_back using namespace std; typedef vector <int> VI; typedef vector < VI > VVI; typedef pair<int, int> PII; VVI G, TRANS, NO, GU; int partID; int out[10009], no[10009], part[10009], parent[10009]; void dfs(int s, int p){ if(part[s] != -1 || parent[s] != -2) return; part[s] = p; REP(i, GU[s].size()){ dfs(GU[s][i], p); } return; } bool partition(VI & nodes){ partID = 0; REP(i,nodes.size()) part[nodes[i]] = -1; REP(i,nodes.size()){ if(part[nodes[i]] == -1 && parent[nodes[i]] == -2){ dfs(nodes[i],partID); partID++; } } } int getBoss(VI & nodes){ REP(i, nodes.size()) no[nodes[i]] = 0; REP(i, nodes.size()) REP(j, NO[nodes[i]].size()) no[ NO[nodes[i]][j] ]++; REP(i, nodes.size()){ if(out[nodes[i]] == 0 && no[nodes[i]] == 0) return nodes[i]; } return -1; } int fix(int node, int par){ REP(i, TRANS[node].size()){ out[TRANS[node][i]]--; } part[node] = -1; parent[node] = par; } bool process(VI& nodes, int root){ int ceo = getBoss(nodes); if(ceo == -1) return false; fix(ceo, root); if(nodes.size() == 1){ return true; } partition(nodes); VVI parts; parts.resize(partID); REP(i,nodes.size()){ if(nodes[i]==ceo) continue; parts[part[nodes[i]]].PB(nodes[i]); } REP(i, parts.size()){ if( !process(parts[i], ceo) ) return false; } return true; } int main(){ int n,m,b,e; char c; scanf("%d %d", &n, &m); REP(i,n){ parent[i] = -2; part[i] = -1; } G.resize(n); TRANS.resize(n); NO.resize(n); GU.resize(n); REP(i,m){ scanf("%d %d %c", &b, &e, &c); b--; e--; if(c == 'T'){ out[b]++; G[b].PB(e); GU[b].PB(e); GU[e].PB(b); TRANS[e].PB(b); } else{ NO[b].PB(e); no[e]++; } } VI init; init.resize(n); REP(i,n) init[i] = i; if( ! process(init, -1) ){ printf( "NIE\n"); } else{ REP(i,n){ printf("%d\n", parent[i] + 1); } } } |