#include<bits/stdc++.h>
using namespace std;
vector<int> tos[1009];
vector<int> ntos[1009];
vector<int> nrnad;
int n, m;
int fat[1009];
vector<int> sons[1009];
int odw[1009];
int licz;
int wyp;
int spr(int gfat){
if(odw[gfat]==0){++licz;++odw[gfat];}
int ret=1;
int wst=0, wsnt=0, wsd=0;
sort(nrnad.begin(), nrnad.end());
while(1){
if(tos[gfat][wst]==nrnad[wsd]){++wsd;if(wsd==nrnad.size())break;}
else if(tos[gfat][wst]<nrnad[wsd]){++wst;if(wst==tos[gfat].size())return 0;}
else return 0;
}
wst=0;wsd=0;
while(1){
if(ntos[gfat][wst]==nrnad[wsd]){return 0;}
else if(ntos[gfat][wst]<nrnad[wsd]){++wst;if(wst==ntos[gfat].size())break;}
else {++wsd;if(wsd==nrnad.size())break;}
}
nrnad.push_back(gfat);
for(int i=0;i<sons[gfat].size();++i){
ret=min(ret, spr(sons[gfat][i]));
}
nrnad.pop_back();
return ret;
}
int cccc(int gfat, int nr){
if(wyp==1)return 1;
if(nr==gfat)return cccc(gfat, nr+1);
int ret=0;
if(nr==n+1){
ret=spr(gfat);
for(int i=1;i<n;++i)odw[i]=0;
if(licz!=n)ret=0;
licz=0;
if(ret==1){
wyp=1;
for(int i=1;i<=n;++i){
printf("%d\n", fat[i]);
}
}
return ret;
}
for(int i=1;i<=n;++i){
sons[i].push_back(nr);
fat[nr]=i;
ret=max(ret,cccc(gfat, nr+1));
sons[i].pop_back();
fat[nr]=0;
}
return ret;
}
int main(){
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'){
tos[a].push_back(b);
}
else{
ntos[a].push_back(a);
}
}
for(int i=1;i<=n;++i){
sort(tos[i].begin(), tos[i].end());
sort(ntos[i].begin(), ntos[i].end());
}
int wyn=0;
for(int i=1;i<=n;++i){
wyn=max(wyn, cccc(i, 1));
}
if(wyn==0)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 | #include<bits/stdc++.h> using namespace std; vector<int> tos[1009]; vector<int> ntos[1009]; vector<int> nrnad; int n, m; int fat[1009]; vector<int> sons[1009]; int odw[1009]; int licz; int wyp; int spr(int gfat){ if(odw[gfat]==0){++licz;++odw[gfat];} int ret=1; int wst=0, wsnt=0, wsd=0; sort(nrnad.begin(), nrnad.end()); while(1){ if(tos[gfat][wst]==nrnad[wsd]){++wsd;if(wsd==nrnad.size())break;} else if(tos[gfat][wst]<nrnad[wsd]){++wst;if(wst==tos[gfat].size())return 0;} else return 0; } wst=0;wsd=0; while(1){ if(ntos[gfat][wst]==nrnad[wsd]){return 0;} else if(ntos[gfat][wst]<nrnad[wsd]){++wst;if(wst==ntos[gfat].size())break;} else {++wsd;if(wsd==nrnad.size())break;} } nrnad.push_back(gfat); for(int i=0;i<sons[gfat].size();++i){ ret=min(ret, spr(sons[gfat][i])); } nrnad.pop_back(); return ret; } int cccc(int gfat, int nr){ if(wyp==1)return 1; if(nr==gfat)return cccc(gfat, nr+1); int ret=0; if(nr==n+1){ ret=spr(gfat); for(int i=1;i<n;++i)odw[i]=0; if(licz!=n)ret=0; licz=0; if(ret==1){ wyp=1; for(int i=1;i<=n;++i){ printf("%d\n", fat[i]); } } return ret; } for(int i=1;i<=n;++i){ sons[i].push_back(nr); fat[nr]=i; ret=max(ret,cccc(gfat, nr+1)); sons[i].pop_back(); fat[nr]=0; } return ret; } int main(){ 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'){ tos[a].push_back(b); } else{ ntos[a].push_back(a); } } for(int i=1;i<=n;++i){ sort(tos[i].begin(), tos[i].end()); sort(ntos[i].begin(), ntos[i].end()); } int wyn=0; for(int i=1;i<=n;++i){ wyn=max(wyn, cccc(i, 1)); } if(wyn==0)printf("NIE\n"); return 0; } |
English