#include <iostream> #include <vector> using namespace std; vector <int> v[1001], dob[1001], zle[1001], st; int d[1001]; int ojc[1001]; int tmp[100001]; int star[1001]; int szef[1001][1001]; int dfs(int i, int k) { d[i] = k; st.push_back(i); int w; while(st.size()) { w = st.back(); st.pop_back(); for(int j = v[w].size() - 1; j >= 0; j --) { if(star[v[w][j]] == 1) { v[w][j] = v[w].back(); v[w].pop_back(); } else if(d[v[w][j]] != k) { d[v[w][j]] = k; st.push_back(v[w][j]); } } } } int main() { ios_base::sync_with_stdio(0); int n, m, a, b, p = 1, licz = 0, sz; char c; cin >> n >> m; for(int i = 0; i < m; i ++) { cin >> a >> b >> c; if(c == 'T') { v[a].push_back(b); v[b].push_back(a); dob[a].push_back(b); } else { zle[a].push_back(b); } } while(licz < p) { for(int i = 1; i <= n; i ++) { if(d[i] == licz) { for(int j = dob[i].size() - 1; j >= 0; j --) { if(star[dob[i][j]] == 1) { dob[i][j] = dob[i].back(); dob[i].pop_back(); } else { szef[licz][i] ++; } } for(int j = zle[i].size() - 1; j >= 0; j --) { if(star[zle[i][j]] == 1 || d[zle[i][j]] != licz) { zle[i][j] = zle[i].back(); zle[i].pop_back(); } else { szef[licz][zle[i][j]] ++; } } } } sz = -1; for(int i = 1; i <= n; i ++) { if(d[i] == licz && szef[licz][i] == 0) { sz = i; break; } } if(sz == -1) { cout << "NIE\n"; return 0; } ojc[sz] = tmp[licz]; star[sz] = 1; v[sz].clear(); dob[sz].clear(); zle[sz].clear(); d[sz] = -1; for(int i = 1; i <=n; i ++) { if(d[i] == licz) { dfs(i, p); tmp[p] = sz; p ++; } } licz ++; } for(int i = 1; i <= n; i ++) { cout << ojc[i] << endl; } 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 | #include <iostream> #include <vector> using namespace std; vector <int> v[1001], dob[1001], zle[1001], st; int d[1001]; int ojc[1001]; int tmp[100001]; int star[1001]; int szef[1001][1001]; int dfs(int i, int k) { d[i] = k; st.push_back(i); int w; while(st.size()) { w = st.back(); st.pop_back(); for(int j = v[w].size() - 1; j >= 0; j --) { if(star[v[w][j]] == 1) { v[w][j] = v[w].back(); v[w].pop_back(); } else if(d[v[w][j]] != k) { d[v[w][j]] = k; st.push_back(v[w][j]); } } } } int main() { ios_base::sync_with_stdio(0); int n, m, a, b, p = 1, licz = 0, sz; char c; cin >> n >> m; for(int i = 0; i < m; i ++) { cin >> a >> b >> c; if(c == 'T') { v[a].push_back(b); v[b].push_back(a); dob[a].push_back(b); } else { zle[a].push_back(b); } } while(licz < p) { for(int i = 1; i <= n; i ++) { if(d[i] == licz) { for(int j = dob[i].size() - 1; j >= 0; j --) { if(star[dob[i][j]] == 1) { dob[i][j] = dob[i].back(); dob[i].pop_back(); } else { szef[licz][i] ++; } } for(int j = zle[i].size() - 1; j >= 0; j --) { if(star[zle[i][j]] == 1 || d[zle[i][j]] != licz) { zle[i][j] = zle[i].back(); zle[i].pop_back(); } else { szef[licz][zle[i][j]] ++; } } } } sz = -1; for(int i = 1; i <= n; i ++) { if(d[i] == licz && szef[licz][i] == 0) { sz = i; break; } } if(sz == -1) { cout << "NIE\n"; return 0; } ojc[sz] = tmp[licz]; star[sz] = 1; v[sz].clear(); dob[sz].clear(); zle[sz].clear(); d[sz] = -1; for(int i = 1; i <=n; i ++) { if(d[i] == licz) { dfs(i, p); tmp[p] = sz; p ++; } } licz ++; } for(int i = 1; i <= n; i ++) { cout << ojc[i] << endl; } return 0; } |