hrbust 1501 (深搜+邻接表)
题意:要求找出不能到达0的输出TRAPPED,从0开始不能到达的输出UNREACHABLE,都满足的输出NO PROBLEMS,
样例:
6
0 1 1
1 1 2
2 3 1 3 0
3 0
4 2 5 0
5 1 4
2
1 1 0
0 1 1
TRAPPED 3
UNREACHABLE 4
UNREACHABLE 5
NO PROBLEMS
#include<cstdio> #include<cstring> typedef struct node { int f; int t; int next; }Qstr; Qstr q[1010]; int h[1010]; int v[1010]; int tot; void cal(int f, int t) { q[tot].f = f; q[tot].t = t; q[tot].next = h[f]; h[f] = tot++; } void dfs(int f) { int i; v[f] = 1; for (i=h[f]; i!=-1; i=q[i].next) { if (v[q[i].t] == 0) { dfs(q[i].t); } } } int main(void) { int n; //int v[1010]; int p[1010]; int m; int x; int flag; while (scanf("%d", &n) != EOF) { memset(h, -1, sizeof(h)); int i; tot = 0; for (i=0; i<n; i++) { scanf("%d%d", &p[i], &m); while (m--) { scanf("%d", &x); cal(p[i], x); } } flag = 0; for (i=0; i<n; i++) { memset(v, 0, sizeof(v)); v[p[i]] = 1; dfs(p[i]); if (v[0] == 0) { flag = 1; printf("TRAPPED %d\n", p[i]); } } memset(v, 0, sizeof(v)); v[0] = 1; dfs(0); for (i=0; i<n; i++) { if (v[p[i]] == 0) { flag = 1; printf("UNREACHABLE %d\n", p[i]); } } if (flag == 0) { printf("NO PROBLEMS\n"); } } return 0; }