#include <bits/stdc++.h>
using namespace std;
using pi=pair<int, int>;
#define st first
#define nd second
const int N=1005, M=10005;
int n;
int id[N], p[N], belongs[N];
bool g[N][N];
vector<int> in[N], out[N], comp[N];
bool bad[N];
void dfs_id(int v, int src, int req_id)
{
if(id[v]!=req_id) return;
id[v]=src;
comp[src].push_back(v);
for(int u: in[v]) dfs_id(u, src, req_id);
for(int u: out[v]) dfs_id(u, src, req_id);
}
inline bool compare_pi(pi a, pi b)
{
return id[a.st]<id[b.st];
}
void print_vector(vector<int> v)
{
printf("{");
for(int i: v) printf("%d ", i);
printf("}\n");
}
void print_vector_pi(vector<pi> v)
{
printf("{");
for(pi i: v) printf("(%d %d), ", i.st, i.nd);
printf("}\n");
}
bool create_tree(int v, vector<pi> banned)
{
//printf("v=%d:\n", v);
id[v]=-v;
//for(int i=1; i<=n; ++i) printf("id[%d]=%d\n", i, id[i]);
for(int i=1; i<=n; ++i) if(id[i]==v) belongs[i]=v;
for(int i=1; i<=n; ++i) dfs_id(i, i, v);
//for(int i=1; i<=n; ++i) printf("id[%d]=%d\n", i, id[i]);
vector<pi> tmp;
for(pi i: banned) if(id[i.st]==id[i.nd]) tmp.push_back(i);
sort(tmp.begin(), tmp.end(), compare_pi);
//print_vector_pi(tmp);
int j=0;
for(int i=1; i<=n; ++i) if(belongs[i]==v&&id[i]==i&&comp[i].size()>0)
{
//printf("i=%d: ", i);
//print_vector(comp[i]);
for(int k: comp[i]) bad[k]=0;
while(j<tmp.size()&&id[tmp[j].st]<i) ++j;
vector<pi> tmp2;
while(j<tmp.size()&&id[tmp[j].st]<=i)
{
bad[tmp[j].nd]=1;
tmp2.push_back(tmp[j]);
++j;
}
for(int k: comp[i]) for(int l: out[k]) bad[l]=1;
//for(int i=1; i<=n; ++i) printf("bad[%d]=%d\n", i, (int)bad[i]);
int good=-1;
for(int k: comp[i]) if(!bad[k]) good=k;
if(good==-1) return 0;
p[good]=v;
for(int k: comp[i]) id[k]=good;
comp[i].clear();
if(!create_tree(good, tmp2)) return 0;
}
return 1;
}
vector<pi> q;
int main()
{
//freopen("reo_new/reo_new144.in", "r", stdin);
int m;
scanf("%d%d", &n, &m);
for(int i=0; i<m; ++i)
{
int a, b;
char c;
scanf("%d%d %c", &a, &b, &c);
if(c=='T')
{
in[a].push_back(b);
out[b].push_back(a);
}
else q.push_back(pi(a, b));
}
for(int i=1; i<=n; ++i) for(int j: out[i]) bad[j]=1;
for(pi i: q) bad[i.nd]=1;
int root=-1;
for(int i=1; i<=n; ++i) if(!bad[i]) root=i;
if(root==-1)
{
printf("NIE\n");
return 0;
}
for(int i=1; i<=n; ++i) id[i]=root;
if(!create_tree(root, q))
{
printf("NIE\n");
return 0;
}
/*for(int i=1; i<=n; ++i)
{
int u=i;
for(; u; u=p[u]) g[i][u]=1;
}
for(int i=1; i<=n; ++i) for(int j: in[i]) if(!g[i][j])
{
printf("NIE\n");
return 0;
}
for(pi i: q) if(g[i.st][i.nd])
{
printf("NIE\n");
return 0;
}*/
//printf("TAK\n");
//for(int i=1; i<=n; ++i) if(p[i]==0) ++cnt0;
for(int i=1; i<=n; ++i) printf("%d\n", p[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 114 115 116 117 118 119 120 121 122 123 124 125 | #include <bits/stdc++.h> using namespace std; using pi=pair<int, int>; #define st first #define nd second const int N=1005, M=10005; int n; int id[N], p[N], belongs[N]; bool g[N][N]; vector<int> in[N], out[N], comp[N]; bool bad[N]; void dfs_id(int v, int src, int req_id) { if(id[v]!=req_id) return; id[v]=src; comp[src].push_back(v); for(int u: in[v]) dfs_id(u, src, req_id); for(int u: out[v]) dfs_id(u, src, req_id); } inline bool compare_pi(pi a, pi b) { return id[a.st]<id[b.st]; } void print_vector(vector<int> v) { printf("{"); for(int i: v) printf("%d ", i); printf("}\n"); } void print_vector_pi(vector<pi> v) { printf("{"); for(pi i: v) printf("(%d %d), ", i.st, i.nd); printf("}\n"); } bool create_tree(int v, vector<pi> banned) { //printf("v=%d:\n", v); id[v]=-v; //for(int i=1; i<=n; ++i) printf("id[%d]=%d\n", i, id[i]); for(int i=1; i<=n; ++i) if(id[i]==v) belongs[i]=v; for(int i=1; i<=n; ++i) dfs_id(i, i, v); //for(int i=1; i<=n; ++i) printf("id[%d]=%d\n", i, id[i]); vector<pi> tmp; for(pi i: banned) if(id[i.st]==id[i.nd]) tmp.push_back(i); sort(tmp.begin(), tmp.end(), compare_pi); //print_vector_pi(tmp); int j=0; for(int i=1; i<=n; ++i) if(belongs[i]==v&&id[i]==i&&comp[i].size()>0) { //printf("i=%d: ", i); //print_vector(comp[i]); for(int k: comp[i]) bad[k]=0; while(j<tmp.size()&&id[tmp[j].st]<i) ++j; vector<pi> tmp2; while(j<tmp.size()&&id[tmp[j].st]<=i) { bad[tmp[j].nd]=1; tmp2.push_back(tmp[j]); ++j; } for(int k: comp[i]) for(int l: out[k]) bad[l]=1; //for(int i=1; i<=n; ++i) printf("bad[%d]=%d\n", i, (int)bad[i]); int good=-1; for(int k: comp[i]) if(!bad[k]) good=k; if(good==-1) return 0; p[good]=v; for(int k: comp[i]) id[k]=good; comp[i].clear(); if(!create_tree(good, tmp2)) return 0; } return 1; } vector<pi> q; int main() { //freopen("reo_new/reo_new144.in", "r", stdin); int m; scanf("%d%d", &n, &m); for(int i=0; i<m; ++i) { int a, b; char c; scanf("%d%d %c", &a, &b, &c); if(c=='T') { in[a].push_back(b); out[b].push_back(a); } else q.push_back(pi(a, b)); } for(int i=1; i<=n; ++i) for(int j: out[i]) bad[j]=1; for(pi i: q) bad[i.nd]=1; int root=-1; for(int i=1; i<=n; ++i) if(!bad[i]) root=i; if(root==-1) { printf("NIE\n"); return 0; } for(int i=1; i<=n; ++i) id[i]=root; if(!create_tree(root, q)) { printf("NIE\n"); return 0; } /*for(int i=1; i<=n; ++i) { int u=i; for(; u; u=p[u]) g[i][u]=1; } for(int i=1; i<=n; ++i) for(int j: in[i]) if(!g[i][j]) { printf("NIE\n"); return 0; } for(pi i: q) if(g[i.st][i.nd]) { printf("NIE\n"); return 0; }*/ //printf("TAK\n"); //for(int i=1; i<=n; ++i) if(p[i]==0) ++cnt0; for(int i=1; i<=n; ++i) printf("%d\n", p[i]); } |
English