#include <bits/stdc++.h>
using namespace std;
int n, m;
vector <int> tak[1007];
vector <int> nie[1007];
vector <int> gru[1007];
int oj[1007];
int l;
int ter[1007];
int zak[1007];
int wyn[1007];
void nope()
{
printf("NIE\n");
exit(0);
}
int fin(int v)
{
if (v!=oj[v])
oj[v]=fin(oj[v]);
return oj[v];
}
inline void uni(int v, int u)
{
v=fin(v);
u=fin(u);
oj[v]=u;
}
void rek(vector <int> wek)
{
if ((int)wek.size()==1)
return;
l++;
for (int i=0; i<wek.size(); i++)
{
ter[wek[i]]=l;
zak[wek[i]]=0;
}
for (int i=0; i<wek.size(); i++)
{
int v=wek[i];
for (int j=0; j<tak[v].size(); j++)
if (ter[tak[v][j]]==l)
zak[v]=1;
for (int j=0; j<nie[v].size(); j++)
if (ter[nie[v][j]]==l)
zak[nie[v][j]]=1;
}
int c=0;
for (int i=0; i<wek.size(); i++)
if (!zak[wek[i]])
c=wek[i];
if (!c)
nope();
for (int i=0; i<wek.size(); i++)
{
if (wek[i]==c)
{
swap(wek[i], wek.back());
wek.pop_back();
i--;
continue;
}
wyn[wek[i]]=c;
oj[wek[i]]=wek[i];
gru[wek[i]].clear();
}
for (int i=0; i<wek.size(); i++)
{
int v=wek[i];
for (int j=0; j<tak[v].size(); j++)
if (ter[tak[v][j]]==l && tak[v][j]!=c)
uni(v, tak[v][j]);
}
for (int i=0; i<wek.size(); i++)
gru[fin(wek[i])].push_back(wek[i]);
int tl=l;
for (int i=0; i<wek.size(); i++)
if (!gru[wek[i]].empty() && ter[wek[i]]==tl)
rek(gru[wek[i]]);
}
int main()
{
scanf("%d%d", &n, &m);
for (int i=1; i<=m; i++)
{
int p1, p2;
char wcz[2];
scanf("%d%d%s", &p1, &p2, wcz);
if (wcz[0]=='T')
tak[p1].push_back(p2);
else
nie[p1].push_back(p2);
}
vector <int> start;
for (int i=1; i<=n; i++)
start.push_back(i);
rek(start);
for (int i=1; i<=n; i++)
printf("%d\n", wyn[i]);
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 105 106 107 108 109 110 111 112 113 | #include <bits/stdc++.h> using namespace std; int n, m; vector <int> tak[1007]; vector <int> nie[1007]; vector <int> gru[1007]; int oj[1007]; int l; int ter[1007]; int zak[1007]; int wyn[1007]; void nope() { printf("NIE\n"); exit(0); } int fin(int v) { if (v!=oj[v]) oj[v]=fin(oj[v]); return oj[v]; } inline void uni(int v, int u) { v=fin(v); u=fin(u); oj[v]=u; } void rek(vector <int> wek) { if ((int)wek.size()==1) return; l++; for (int i=0; i<wek.size(); i++) { ter[wek[i]]=l; zak[wek[i]]=0; } for (int i=0; i<wek.size(); i++) { int v=wek[i]; for (int j=0; j<tak[v].size(); j++) if (ter[tak[v][j]]==l) zak[v]=1; for (int j=0; j<nie[v].size(); j++) if (ter[nie[v][j]]==l) zak[nie[v][j]]=1; } int c=0; for (int i=0; i<wek.size(); i++) if (!zak[wek[i]]) c=wek[i]; if (!c) nope(); for (int i=0; i<wek.size(); i++) { if (wek[i]==c) { swap(wek[i], wek.back()); wek.pop_back(); i--; continue; } wyn[wek[i]]=c; oj[wek[i]]=wek[i]; gru[wek[i]].clear(); } for (int i=0; i<wek.size(); i++) { int v=wek[i]; for (int j=0; j<tak[v].size(); j++) if (ter[tak[v][j]]==l && tak[v][j]!=c) uni(v, tak[v][j]); } for (int i=0; i<wek.size(); i++) gru[fin(wek[i])].push_back(wek[i]); int tl=l; for (int i=0; i<wek.size(); i++) if (!gru[wek[i]].empty() && ter[wek[i]]==tl) rek(gru[wek[i]]); } int main() { scanf("%d%d", &n, &m); for (int i=1; i<=m; i++) { int p1, p2; char wcz[2]; scanf("%d%d%s", &p1, &p2, wcz); if (wcz[0]=='T') tak[p1].push_back(p2); else nie[p1].push_back(p2); } vector <int> start; for (int i=1; i<=n; i++) start.push_back(i); rek(start); for (int i=1; i<=n; i++) printf("%d\n", wyn[i]); return 0; } |
English