#include <bits/stdc++.h> using namespace std; int n, m; vector <int> tak[1007]; vector <int> nie[1007]; vector <int> gru[1007]; int oj[1007]; int l; int ter[1007]; int zak[1007]; int wyn[1007]; void nope() { printf("NIE\n"); exit(0); } int fin(int v) { if (v!=oj[v]) oj[v]=fin(oj[v]); return oj[v]; } inline void uni(int v, int u) { v=fin(v); u=fin(u); oj[v]=u; } void rek(vector <int> wek) { if ((int)wek.size()==1) return; l++; for (int i=0; i<wek.size(); i++) { ter[wek[i]]=l; zak[wek[i]]=0; } for (int i=0; i<wek.size(); i++) { int v=wek[i]; for (int j=0; j<tak[v].size(); j++) if (ter[tak[v][j]]==l) zak[v]=1; for (int j=0; j<nie[v].size(); j++) if (ter[nie[v][j]]==l) zak[nie[v][j]]=1; } int c=0; for (int i=0; i<wek.size(); i++) if (!zak[wek[i]]) c=wek[i]; if (!c) nope(); for (int i=0; i<wek.size(); i++) { if (wek[i]==c) { swap(wek[i], wek.back()); wek.pop_back(); i--; continue; } wyn[wek[i]]=c; oj[wek[i]]=wek[i]; gru[wek[i]].clear(); } for (int i=0; i<wek.size(); i++) { int v=wek[i]; for (int j=0; j<tak[v].size(); j++) if (ter[tak[v][j]]==l && tak[v][j]!=c) uni(v, tak[v][j]); } for (int i=0; i<wek.size(); i++) gru[fin(wek[i])].push_back(wek[i]); int tl=l; for (int i=0; i<wek.size(); i++) if (!gru[wek[i]].empty() && ter[wek[i]]==tl) rek(gru[wek[i]]); } int main() { scanf("%d%d", &n, &m); for (int i=1; i<=m; i++) { int p1, p2; char wcz[2]; scanf("%d%d%s", &p1, &p2, wcz); if (wcz[0]=='T') tak[p1].push_back(p2); else nie[p1].push_back(p2); } vector <int> start; for (int i=1; i<=n; i++) start.push_back(i); rek(start); for (int i=1; i<=n; i++) printf("%d\n", wyn[i]); return 0; }
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 | #include <bits/stdc++.h> using namespace std; int n, m; vector <int> tak[1007]; vector <int> nie[1007]; vector <int> gru[1007]; int oj[1007]; int l; int ter[1007]; int zak[1007]; int wyn[1007]; void nope() { printf("NIE\n"); exit(0); } int fin(int v) { if (v!=oj[v]) oj[v]=fin(oj[v]); return oj[v]; } inline void uni(int v, int u) { v=fin(v); u=fin(u); oj[v]=u; } void rek(vector <int> wek) { if ((int)wek.size()==1) return; l++; for (int i=0; i<wek.size(); i++) { ter[wek[i]]=l; zak[wek[i]]=0; } for (int i=0; i<wek.size(); i++) { int v=wek[i]; for (int j=0; j<tak[v].size(); j++) if (ter[tak[v][j]]==l) zak[v]=1; for (int j=0; j<nie[v].size(); j++) if (ter[nie[v][j]]==l) zak[nie[v][j]]=1; } int c=0; for (int i=0; i<wek.size(); i++) if (!zak[wek[i]]) c=wek[i]; if (!c) nope(); for (int i=0; i<wek.size(); i++) { if (wek[i]==c) { swap(wek[i], wek.back()); wek.pop_back(); i--; continue; } wyn[wek[i]]=c; oj[wek[i]]=wek[i]; gru[wek[i]].clear(); } for (int i=0; i<wek.size(); i++) { int v=wek[i]; for (int j=0; j<tak[v].size(); j++) if (ter[tak[v][j]]==l && tak[v][j]!=c) uni(v, tak[v][j]); } for (int i=0; i<wek.size(); i++) gru[fin(wek[i])].push_back(wek[i]); int tl=l; for (int i=0; i<wek.size(); i++) if (!gru[wek[i]].empty() && ter[wek[i]]==tl) rek(gru[wek[i]]); } int main() { scanf("%d%d", &n, &m); for (int i=1; i<=m; i++) { int p1, p2; char wcz[2]; scanf("%d%d%s", &p1, &p2, wcz); if (wcz[0]=='T') tak[p1].push_back(p2); else nie[p1].push_back(p2); } vector <int> start; for (int i=1; i<=n; i++) start.push_back(i); rek(start); for (int i=1; i<=n; i++) printf("%d\n", wyn[i]); return 0; } |