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

 

posted @ 2013-03-18 22:09  尔滨之夏  阅读(194)  评论(0编辑  收藏  举报