#include <cstdio>
#include <cstring>
#include <vector>
int N,M;
std::vector<int> supervisor[1010];
std::vector<int> bsupervisor[1010];
std::vector<int> enemy[1010];
int parent[1010];
void search(int node, const std::vector<bool> &isset, std::vector<int> &ngroup, int group) {
ngroup[node]=group;
for (unsigned i=0; i<bsupervisor[node].size(); ++i) {
int child = bsupervisor[node][i];
if (isset[child] && ngroup[child]==0) {
search(child, isset, ngroup, group);
}
}
}
bool create(const std::vector<int> &nodes, int p) {
std::vector<bool> disliked(N+1, false);
std::vector<bool> likes(N+1, false);
std::vector<bool> isset(N+1, false);
std::vector<int> ngroup(N+1,0);
std::vector<std::vector<int> > gnodes(nodes.size(), std::vector<int>());
int root = 0;
int group = 0;
for (unsigned i=0; i<nodes.size(); ++i) {
isset[nodes[i]] = true;
}
for (unsigned i=0; i<nodes.size(); ++i) {
for (unsigned j=0; j<enemy[nodes[i]].size(); ++j) {
disliked[enemy[nodes[i]][j]] = true;
}
for (unsigned j=0; j<supervisor[nodes[i]].size(); ++j) {
if (isset[supervisor[nodes[i]][j]]) likes[nodes[i]] = true;
}
}
for (unsigned i=0; i<nodes.size(); ++i) {
if (disliked[nodes[i]] == false && likes[nodes[i]] == false) root = nodes[i];
}
if (root == 0) return false;
isset[root] = false;
parent[root] = p;
//split
for (unsigned i=0; i<nodes.size(); ++i) {
if (ngroup[nodes[i]]==0 && nodes[i]!=root) {
search(nodes[i],isset,ngroup,++group);
}
if (nodes[i]!=root) {
gnodes[ngroup[nodes[i]]].push_back(nodes[i]);
}
}
for (int i=1; i<=group; ++i) {
if (create(gnodes[i], root) == false) return false;
}
return true;
}
int main() {
std::vector<int> all;
memset(parent,0,sizeof(parent));
scanf("%d %d",&N,&M);
for (int i=1; i<=N; ++i) {
all.push_back(i);
}
for (int i=1; i<=M; ++i) {
int a,b;
char c;
scanf("%d %d %c",&a,&b,&c);
if (c=='T') {
supervisor[a].push_back(b);
bsupervisor[b].push_back(a);
bsupervisor[a].push_back(b);
} else {
enemy[a].push_back(b);
}
}
if (create(all,0)) {
for (int i=1;i<=N;++i) {
printf("%d\n",parent[i]);
}
} else {
printf("NIE\n");
}
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 | #include <cstdio> #include <cstring> #include <vector> int N,M; std::vector<int> supervisor[1010]; std::vector<int> bsupervisor[1010]; std::vector<int> enemy[1010]; int parent[1010]; void search(int node, const std::vector<bool> &isset, std::vector<int> &ngroup, int group) { ngroup[node]=group; for (unsigned i=0; i<bsupervisor[node].size(); ++i) { int child = bsupervisor[node][i]; if (isset[child] && ngroup[child]==0) { search(child, isset, ngroup, group); } } } bool create(const std::vector<int> &nodes, int p) { std::vector<bool> disliked(N+1, false); std::vector<bool> likes(N+1, false); std::vector<bool> isset(N+1, false); std::vector<int> ngroup(N+1,0); std::vector<std::vector<int> > gnodes(nodes.size(), std::vector<int>()); int root = 0; int group = 0; for (unsigned i=0; i<nodes.size(); ++i) { isset[nodes[i]] = true; } for (unsigned i=0; i<nodes.size(); ++i) { for (unsigned j=0; j<enemy[nodes[i]].size(); ++j) { disliked[enemy[nodes[i]][j]] = true; } for (unsigned j=0; j<supervisor[nodes[i]].size(); ++j) { if (isset[supervisor[nodes[i]][j]]) likes[nodes[i]] = true; } } for (unsigned i=0; i<nodes.size(); ++i) { if (disliked[nodes[i]] == false && likes[nodes[i]] == false) root = nodes[i]; } if (root == 0) return false; isset[root] = false; parent[root] = p; //split for (unsigned i=0; i<nodes.size(); ++i) { if (ngroup[nodes[i]]==0 && nodes[i]!=root) { search(nodes[i],isset,ngroup,++group); } if (nodes[i]!=root) { gnodes[ngroup[nodes[i]]].push_back(nodes[i]); } } for (int i=1; i<=group; ++i) { if (create(gnodes[i], root) == false) return false; } return true; } int main() { std::vector<int> all; memset(parent,0,sizeof(parent)); scanf("%d %d",&N,&M); for (int i=1; i<=N; ++i) { all.push_back(i); } for (int i=1; i<=M; ++i) { int a,b; char c; scanf("%d %d %c",&a,&b,&c); if (c=='T') { supervisor[a].push_back(b); bsupervisor[b].push_back(a); bsupervisor[a].push_back(b); } else { enemy[a].push_back(b); } } if (create(all,0)) { for (int i=1;i<=N;++i) { printf("%d\n",parent[i]); } } else { printf("NIE\n"); } return 0; } |
English