#include <cstdio>
#include <map>
#include <vector>
#include <set>
using namespace std;
int parent[1009];
vector<int> need[1009];
vector<int> rneed[1009];
vector<int> cant[1009];
void dfs(set<int>& vertices, map<int, int>& result, int v, int c){
result[v]=c;
for(auto u:need[v]){
if(vertices.count(u)){
if(result.count(u)==0){
dfs(vertices, result, u, c);
}
}
}
for(auto u:rneed[v]){
if(vertices.count(u)){
if(result.count(u)==0){
dfs(vertices, result, u, c);
}
}
}
}
bool solve(set<int>& vertices, int par){
map<int, bool> director; // Can vertex i be a director of all?
for(auto v:vertices){
director[v]=true;
}
for(auto v:vertices){
for(auto u:need[v]){
if(vertices.count(u)){
// v wants someone above, so v cannot be director.
director[v]=false;
}
}
for(auto u:cant[v]){
if(vertices.count(u)){
// v doesn't want u above, so u cannot be a director.
director[u]=false;
}
}
}
set<int> directors;
for(auto v:vertices){
if(director[v]){
directors.insert(v);
parent[v]=par;
par=v;
}
}
if(directors.size()==0){
return false;
}
for(auto d:directors){
vertices.erase(d);
}
map<int, int> component;
int c=0;
for(auto v:vertices){
if(component.count(v)==0){
dfs(vertices, component, v, c++);
}
}
vector<set<int>> components;
components.resize(c);
for(auto v:vertices){
components[component[v]].insert(v);
}
for(auto& comp:components){
if(!solve(comp, par)){
return false;
}
}
return true;
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
char s[10];
int a, b;
scanf("%d %d %s",&a,&b,s);
if(s[0]=='T'){
need[a].push_back(b);
rneed[b].push_back(a);
}
else{
cant[a].push_back(b);
}
}
set<int> vertices;
for(int i=1;i<=n;i++){
vertices.insert(i);
parent[i]=-1;
}
if(!solve(vertices, 0)){
printf("NIE\n");
fprintf(stderr, "reason - no viable directors\n");
return 0;
}
for(int i=1;i<=n;i++){
printf("%d\n", parent[i]);
}
}
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 <cstdio> #include <map> #include <vector> #include <set> using namespace std; int parent[1009]; vector<int> need[1009]; vector<int> rneed[1009]; vector<int> cant[1009]; void dfs(set<int>& vertices, map<int, int>& result, int v, int c){ result[v]=c; for(auto u:need[v]){ if(vertices.count(u)){ if(result.count(u)==0){ dfs(vertices, result, u, c); } } } for(auto u:rneed[v]){ if(vertices.count(u)){ if(result.count(u)==0){ dfs(vertices, result, u, c); } } } } bool solve(set<int>& vertices, int par){ map<int, bool> director; // Can vertex i be a director of all? for(auto v:vertices){ director[v]=true; } for(auto v:vertices){ for(auto u:need[v]){ if(vertices.count(u)){ // v wants someone above, so v cannot be director. director[v]=false; } } for(auto u:cant[v]){ if(vertices.count(u)){ // v doesn't want u above, so u cannot be a director. director[u]=false; } } } set<int> directors; for(auto v:vertices){ if(director[v]){ directors.insert(v); parent[v]=par; par=v; } } if(directors.size()==0){ return false; } for(auto d:directors){ vertices.erase(d); } map<int, int> component; int c=0; for(auto v:vertices){ if(component.count(v)==0){ dfs(vertices, component, v, c++); } } vector<set<int>> components; components.resize(c); for(auto v:vertices){ components[component[v]].insert(v); } for(auto& comp:components){ if(!solve(comp, par)){ return false; } } return true; } int main(){ int n,m; scanf("%d %d",&n,&m); for(int i=0;i<m;i++){ char s[10]; int a, b; scanf("%d %d %s",&a,&b,s); if(s[0]=='T'){ need[a].push_back(b); rneed[b].push_back(a); } else{ cant[a].push_back(b); } } set<int> vertices; for(int i=1;i<=n;i++){ vertices.insert(i); parent[i]=-1; } if(!solve(vertices, 0)){ printf("NIE\n"); fprintf(stderr, "reason - no viable directors\n"); return 0; } for(int i=1;i<=n;i++){ printf("%d\n", parent[i]); } } |
English