//Reorganizacja [REO] #include <cstdio> #include <vector> using namespace std; int n,m,rt,ii,i,cur,cc,c[10100],d[10100],pp[10100],p[10100],x[10100],y[10100]; bool a[10100],ok[10100]; vector<int> g[1010]; char s[5]; void dfs(int i) { c[i]=cc; for (int j=0; j<g[i].size(); j++) { int k=g[i][j]; if (p[k]==-1) { if (c[k]==0) dfs(k); } else if (d[k]>d[cur]) cur=k; } } int main() { scanf("%d%d",&n,&m); for (i=0; i<m; i++) { scanf("%d%d",&x[i],&y[i]); scanf("%s",s); if (s[0]=='T') { g[x[i]].push_back(y[i]); g[y[i]].push_back(x[i]); a[i]=true; } } for (i=1; i<=n; i++) p[i]=-1; for (ii=0; ii<n; ii++) { for (i=1; i<=n; i++) { c[i]=int(ii==0); ok[i]=true; } if (ii==0) { cc=1; pp[1]=0; } else for (cc=0, i=1; i<=n; i++) if (p[i]==-1 && c[i]==0) { cc++; cur=rt; dfs(i); pp[cc]=cur; } for (i=0; i<m; i++) if (c[x[i]]!=0 && c[x[i]]==c[y[i]]) { if (a[i]) ok[x[i]]=false; else ok[y[i]]=false; } for (i=1; i<=n; i++) if (p[i]==-1 && ok[i]) { p[i]=pp[c[i]]; d[i]=d[p[i]]+1; if (ii==0) rt=i; break; } if (i>n) break; } if (ii>=n) for (i=1; i<=n; i++) printf("%d\n",p[i]); else puts("NIE"); 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 | //Reorganizacja [REO] #include <cstdio> #include <vector> using namespace std; int n,m,rt,ii,i,cur,cc,c[10100],d[10100],pp[10100],p[10100],x[10100],y[10100]; bool a[10100],ok[10100]; vector<int> g[1010]; char s[5]; void dfs(int i) { c[i]=cc; for (int j=0; j<g[i].size(); j++) { int k=g[i][j]; if (p[k]==-1) { if (c[k]==0) dfs(k); } else if (d[k]>d[cur]) cur=k; } } int main() { scanf("%d%d",&n,&m); for (i=0; i<m; i++) { scanf("%d%d",&x[i],&y[i]); scanf("%s",s); if (s[0]=='T') { g[x[i]].push_back(y[i]); g[y[i]].push_back(x[i]); a[i]=true; } } for (i=1; i<=n; i++) p[i]=-1; for (ii=0; ii<n; ii++) { for (i=1; i<=n; i++) { c[i]=int(ii==0); ok[i]=true; } if (ii==0) { cc=1; pp[1]=0; } else for (cc=0, i=1; i<=n; i++) if (p[i]==-1 && c[i]==0) { cc++; cur=rt; dfs(i); pp[cc]=cur; } for (i=0; i<m; i++) if (c[x[i]]!=0 && c[x[i]]==c[y[i]]) { if (a[i]) ok[x[i]]=false; else ok[y[i]]=false; } for (i=1; i<=n; i++) if (p[i]==-1 && ok[i]) { p[i]=pp[c[i]]; d[i]=d[p[i]]+1; if (ii==0) rt=i; break; } if (i>n) break; } if (ii>=n) for (i=1; i<=n; i++) printf("%d\n",p[i]); else puts("NIE"); return 0; } |