#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; } |
English