#include<stdio.h> #include<vector> #include<queue> #include<bitset> using namespace std; vector<int> milosc[1000],nienawisc[1000]; bitset<1004> isLove[1000],isLove2[1000],isHate[1000],isHate2[1000]; void print(bitset<1004> b, int n) { printf("%s\n",b.to_string().substr(n).c_str()); } int ileKocha[1000]; int main() { int n,m; scanf("%d%d",&n,&m); for (int i=0;i<m;i++) { int a,b;char ch; scanf("%d %d %c",&a,&b,&ch); a--;b--; if(ch=='T') { milosc[a].push_back(b); ileKocha[b]++; isLove[a][b] = true; isLove2[b][a]=true; } else { nienawisc[a].push_back(b); isHate[a][b]=true; isHate2[b][a]=true; } } queue<int> kory; for (int i =0;i<n;i++) { if(ileKocha[i] == 0 ) kory.push(i); } int ile=0; while(!kory.empty()) { ile++; int u = kory. front(); kory.pop(); for (int i =0;i<milosc[u].size();i++) { int v=milosc[u][i]; ileKocha[v]--; if(ileKocha[v] == 0 ) kory.push(v); isHate[v]|= isHate[u]; //nienawisc[v].insert(nienawisc[v].end(), nienawisc[u].begin(), nienawisc[u].end()); } } bool fail=0; if(ile<n ) {printf("NIE\n"); return 0;} for (int i =0;i<n;i++) if(isHate[i][i]) {fail=1;break;} if(fail) {printf("NIE\n"); return 0;} //find boss int boss=-1; for (int i =0;i<n;i++) { if(isHate2[i].count() == 0 && milosc[i].size()==0) { boss=i;break; } } if(boss==-1) { printf("NIE\n"); return 0;} queue<int> bossy; bossy.push(boss); bool byl[1004]={}; int level[1004]={}; int t[1004]; t[boss]=-1; while(!bossy.empty()) { int b = bossy.front(); byl[b]=true; bossy.pop(); for (int i =0;i<n;i++) { if(byl[i]) continue; if(isHate[i][b]) continue; bitset<1004> tmp= isLove2[b] & isLove[i]; if(tmp.count() ==0) { bossy.push(i); t[i]=b; } } } for (int i =0;i<n;i++) printf("%d\n",t[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 | #include<stdio.h> #include<vector> #include<queue> #include<bitset> using namespace std; vector<int> milosc[1000],nienawisc[1000]; bitset<1004> isLove[1000],isLove2[1000],isHate[1000],isHate2[1000]; void print(bitset<1004> b, int n) { printf("%s\n",b.to_string().substr(n).c_str()); } int ileKocha[1000]; int main() { int n,m; scanf("%d%d",&n,&m); for (int i=0;i<m;i++) { int a,b;char ch; scanf("%d %d %c",&a,&b,&ch); a--;b--; if(ch=='T') { milosc[a].push_back(b); ileKocha[b]++; isLove[a][b] = true; isLove2[b][a]=true; } else { nienawisc[a].push_back(b); isHate[a][b]=true; isHate2[b][a]=true; } } queue<int> kory; for (int i =0;i<n;i++) { if(ileKocha[i] == 0 ) kory.push(i); } int ile=0; while(!kory.empty()) { ile++; int u = kory. front(); kory.pop(); for (int i =0;i<milosc[u].size();i++) { int v=milosc[u][i]; ileKocha[v]--; if(ileKocha[v] == 0 ) kory.push(v); isHate[v]|= isHate[u]; //nienawisc[v].insert(nienawisc[v].end(), nienawisc[u].begin(), nienawisc[u].end()); } } bool fail=0; if(ile<n ) {printf("NIE\n"); return 0;} for (int i =0;i<n;i++) if(isHate[i][i]) {fail=1;break;} if(fail) {printf("NIE\n"); return 0;} //find boss int boss=-1; for (int i =0;i<n;i++) { if(isHate2[i].count() == 0 && milosc[i].size()==0) { boss=i;break; } } if(boss==-1) { printf("NIE\n"); return 0;} queue<int> bossy; bossy.push(boss); bool byl[1004]={}; int level[1004]={}; int t[1004]; t[boss]=-1; while(!bossy.empty()) { int b = bossy.front(); byl[b]=true; bossy.pop(); for (int i =0;i<n;i++) { if(byl[i]) continue; if(isHate[i][b]) continue; bitset<1004> tmp= isLove2[b] & isLove[i]; if(tmp.count() ==0) { bossy.push(i); t[i]=b; } } } for (int i =0;i<n;i++) printf("%d\n",t[i]+1); } |