#include <stdio.h> int m,n,d; struct e { int v; struct e *n; } e[1000100], *v[500200]; int MIN(int a, int b) { return a < b ? a : b; } int st[500200],sp,sc=0,ix=1; int idx[500200]; int res[500200]; int lidx[500200]; int on[500200]; void scc(int i) { int j; struct e *e; idx[i] = lidx[i] = ix++; st[sp++] = i; on[i] = 1; for (e=v[i]; e; e=e->n) { // printf("%d -> %d\n", i+1, e->v+1); if (!idx[e->v]) { scc(e->v); lidx[i] = MIN(lidx[i], lidx[e->v]); } else if (on[e->v]) { lidx[i] = MIN(lidx[i], idx[e->v]); } } if (idx[i] == lidx[i]) { int size = 0; do { j = st[--sp]; on[j] = 0; // printf(" %d",j+1); size++; } while(i != j); // printf(" (%d)\n",size); sc+= size > 1; } } int rem,cp; int _fc(int i) { struct e *e; if (i == rem) return 0; idx[i] = cp; for (e=v[i]; e; e=e->n) { if (e->v == rem) continue; // printf("%d -> %d\n", i+1, e->v+1); if (idx[e->v]!=cp) { if (_fc(e->v)) return 1; } else { // printf("return\n"); return 1; } } return 0; } int fc() { int i; cp = 0; for (i = 0; i < n; i++) idx[i] = 0; for (i = 0; i < n; i++) if (!idx[i]) { cp++; if(_fc(i)) return 1; } return 0; } int main() { int i,r=0; scanf("%d%d",&n,&m); for (i = 0; i < m; i++) { int v1, v2; scanf("%d%d",&v1,&v2); v1--; v2--; e[1*i].v=v2; // e[2*i+1].v=v2; e[1*i].n=v[v1]; // e[2*i+1].n=v[v1]; v[v1]=e+1*i; // v[v1]=e+2*i+1; } for (i = 0; i < n; i++) if (!idx[i]) { // printf("--%d\n", i+1); scc(i); } if (sc ==0) return!printf("NIE\n"); if (sc > 1) return!printf("0\n\n"); for (i = 0; i < n; i++) { rem = i; // printf("rem=%d\n",rem+1); if(!fc()) res[i] = 1, r++; } printf("%d\n",r); for (i = 0; i < n; i++) if (res[i]) { printf("%d%s", i+1, --r?" ":""); } puts(""); 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 <stdio.h> int m,n,d; struct e { int v; struct e *n; } e[1000100], *v[500200]; int MIN(int a, int b) { return a < b ? a : b; } int st[500200],sp,sc=0,ix=1; int idx[500200]; int res[500200]; int lidx[500200]; int on[500200]; void scc(int i) { int j; struct e *e; idx[i] = lidx[i] = ix++; st[sp++] = i; on[i] = 1; for (e=v[i]; e; e=e->n) { // printf("%d -> %d\n", i+1, e->v+1); if (!idx[e->v]) { scc(e->v); lidx[i] = MIN(lidx[i], lidx[e->v]); } else if (on[e->v]) { lidx[i] = MIN(lidx[i], idx[e->v]); } } if (idx[i] == lidx[i]) { int size = 0; do { j = st[--sp]; on[j] = 0; // printf(" %d",j+1); size++; } while(i != j); // printf(" (%d)\n",size); sc+= size > 1; } } int rem,cp; int _fc(int i) { struct e *e; if (i == rem) return 0; idx[i] = cp; for (e=v[i]; e; e=e->n) { if (e->v == rem) continue; // printf("%d -> %d\n", i+1, e->v+1); if (idx[e->v]!=cp) { if (_fc(e->v)) return 1; } else { // printf("return\n"); return 1; } } return 0; } int fc() { int i; cp = 0; for (i = 0; i < n; i++) idx[i] = 0; for (i = 0; i < n; i++) if (!idx[i]) { cp++; if(_fc(i)) return 1; } return 0; } int main() { int i,r=0; scanf("%d%d",&n,&m); for (i = 0; i < m; i++) { int v1, v2; scanf("%d%d",&v1,&v2); v1--; v2--; e[1*i].v=v2; // e[2*i+1].v=v2; e[1*i].n=v[v1]; // e[2*i+1].n=v[v1]; v[v1]=e+1*i; // v[v1]=e+2*i+1; } for (i = 0; i < n; i++) if (!idx[i]) { // printf("--%d\n", i+1); scc(i); } if (sc ==0) return!printf("NIE\n"); if (sc > 1) return!printf("0\n\n"); for (i = 0; i < n; i++) { rem = i; // printf("rem=%d\n",rem+1); if(!fc()) res[i] = 1, r++; } printf("%d\n",r); for (i = 0; i < n; i++) if (res[i]) { printf("%d%s", i+1, --r?" ":""); } puts(""); return 0; } |