#include <bits/stdc++.h> #define FOR(i,a,b) for(int i = (a); i <= (b); ++i) #define FORW(i,a,b) for(int i = (a); i < (b); ++i) #define SIZE(X) (int)(X).size() using namespace std; typedef pair<int,int> edge; template<typename T> ostream& operator<< (ostream& os, const vector<T> &X) { os << "<"; for(T x : X) os << x << " "; os << ">"; return os; } template<typename A, typename B> ostream& operator<< (ostream& os, const pair<A,B> &P) { os << "(" << P.first << " " << P.second << ")"; return os; } int ans[1010]; int D[1010], cnt; int kan(vector<edge> &T, vector<edge> &N, vector<int> &A) { cnt++; for(edge t : T) D[t.first] = cnt; for(edge n : N) D[n.second] = cnt; for(int a : A) if(D[a] != cnt) return a; return -1; } int O[1010], ooo; vector<int> G[1010]; int SK[1010]; void dfs(int a, vector<int> &R) { O[a] = ooo; R.push_back(a); for(int g : G[a]) if(O[g] != ooo) dfs(g,R); } template<typename T> void CV(vector<T> &V) { vector<T> X; swap(X,V); } void go(vector<edge> &T, vector<edge> &N, vector<int> &A, int f, int cnt = 0) { if(A.size() == 1) { ans[A[0]] = f; return; } int k = kan(T,N,A); if(k == -1) { printf("NIE\n"); exit(0); } ooo++; ans[k] = f; O[k] = ooo; vector<vector<int>> V; vector<vector<edge>> TT; vector<vector<edge>> NN; for(int a : A) G[a].clear(); for(edge e : T) { G[e.first].push_back(e.second); G[e.second].push_back(e.first); } for(int a : A) { if(O[a] != ooo){ vector<int> tmp; dfs(a,tmp); V.push_back(tmp); TT.push_back({}); for(int t : tmp) SK[t] = NN.size(); NN.push_back({}); } } SK[k] = NN.size(); for(edge t : T) { assert(SK[t.first] == SK[t.second] or t.first == k or t.second == k); //cout << SK[t.first] << " " << SIZE(TT) << endl; if(SK[t.first] == SK[t.second]) TT[SK[t.first]].push_back(t); } for(edge n : N) { if(SK[n.first] == SK[n.second]) NN[SK[n.second]].push_back(n); } FORW(i,0,SIZE(V)) go(TT[i],NN[i],V[i],k,cnt+1); } int main() { int n,m; scanf("%d%d",&n,&m); vector<edge> T,N; vector<int> A; FOR(i,1,n) A.push_back(i); FOR(i,1,m) { int a,b; char c; scanf("%d%d %c",&a,&b,&c); if(c == 'T') { T.push_back(edge(a,b)); G[a].push_back(b); G[b].push_back(a); } else N.push_back(edge(a,b)); } go(T,N,A,0); FOR(i,1,n) { vector<int> mn, mt; for(edge t : T) if(t.first == i) mt.push_back(t.second); for(edge t : N) if(t.first == i) mn.push_back(t.second); set<int> S; int ii = i; while(ii) {S.insert(ii); ii = ans[ii];} for(int t : mt) assert(S.find(t) != S.end()); for(int nn : mn) { if(S.find(nn) != S.end()){ int iii = i; while(iii) {printf("%d ", iii); if(iii == 324) printf("ELO"); iii = ans[iii];} printf("\n"); printf("%d %d N\n", i,nn); } assert(S.find(nn) == S.end()); } } //printf("TAK\n"); //return 0; FOR(i,1,n) { printf("%d\n", ans[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 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | #include <bits/stdc++.h> #define FOR(i,a,b) for(int i = (a); i <= (b); ++i) #define FORW(i,a,b) for(int i = (a); i < (b); ++i) #define SIZE(X) (int)(X).size() using namespace std; typedef pair<int,int> edge; template<typename T> ostream& operator<< (ostream& os, const vector<T> &X) { os << "<"; for(T x : X) os << x << " "; os << ">"; return os; } template<typename A, typename B> ostream& operator<< (ostream& os, const pair<A,B> &P) { os << "(" << P.first << " " << P.second << ")"; return os; } int ans[1010]; int D[1010], cnt; int kan(vector<edge> &T, vector<edge> &N, vector<int> &A) { cnt++; for(edge t : T) D[t.first] = cnt; for(edge n : N) D[n.second] = cnt; for(int a : A) if(D[a] != cnt) return a; return -1; } int O[1010], ooo; vector<int> G[1010]; int SK[1010]; void dfs(int a, vector<int> &R) { O[a] = ooo; R.push_back(a); for(int g : G[a]) if(O[g] != ooo) dfs(g,R); } template<typename T> void CV(vector<T> &V) { vector<T> X; swap(X,V); } void go(vector<edge> &T, vector<edge> &N, vector<int> &A, int f, int cnt = 0) { if(A.size() == 1) { ans[A[0]] = f; return; } int k = kan(T,N,A); if(k == -1) { printf("NIE\n"); exit(0); } ooo++; ans[k] = f; O[k] = ooo; vector<vector<int>> V; vector<vector<edge>> TT; vector<vector<edge>> NN; for(int a : A) G[a].clear(); for(edge e : T) { G[e.first].push_back(e.second); G[e.second].push_back(e.first); } for(int a : A) { if(O[a] != ooo){ vector<int> tmp; dfs(a,tmp); V.push_back(tmp); TT.push_back({}); for(int t : tmp) SK[t] = NN.size(); NN.push_back({}); } } SK[k] = NN.size(); for(edge t : T) { assert(SK[t.first] == SK[t.second] or t.first == k or t.second == k); //cout << SK[t.first] << " " << SIZE(TT) << endl; if(SK[t.first] == SK[t.second]) TT[SK[t.first]].push_back(t); } for(edge n : N) { if(SK[n.first] == SK[n.second]) NN[SK[n.second]].push_back(n); } FORW(i,0,SIZE(V)) go(TT[i],NN[i],V[i],k,cnt+1); } int main() { int n,m; scanf("%d%d",&n,&m); vector<edge> T,N; vector<int> A; FOR(i,1,n) A.push_back(i); FOR(i,1,m) { int a,b; char c; scanf("%d%d %c",&a,&b,&c); if(c == 'T') { T.push_back(edge(a,b)); G[a].push_back(b); G[b].push_back(a); } else N.push_back(edge(a,b)); } go(T,N,A,0); FOR(i,1,n) { vector<int> mn, mt; for(edge t : T) if(t.first == i) mt.push_back(t.second); for(edge t : N) if(t.first == i) mn.push_back(t.second); set<int> S; int ii = i; while(ii) {S.insert(ii); ii = ans[ii];} for(int t : mt) assert(S.find(t) != S.end()); for(int nn : mn) { if(S.find(nn) != S.end()){ int iii = i; while(iii) {printf("%d ", iii); if(iii == 324) printf("ELO"); iii = ans[iii];} printf("\n"); printf("%d %d N\n", i,nn); } assert(S.find(nn) == S.end()); } } //printf("TAK\n"); //return 0; FOR(i,1,n) { printf("%d\n", ans[i]); } return 0; } |