HRBUST 1501 Car Trouble 深搜

来源:互联网 发布:什么是嵌入式软件开发 编辑:程序博客网 时间:2024/05/18 20:35

题意

第一行一个整数n 代表 街道的数目

接下来n行 每一行第一个数字id 代表一个街道的编号,第二个数字tot代表id这个街道能到达的街道数,接下来tot个数字代表id街道能到达的街道的编号

输出要求

_1 如果编号为x的街道不能从0号街道到达,输出UNREACHABLE X

_2 如果编号为x的街道不能到达0号街道,输出TRAPPED X

如果没有符合上述情况的街道,输出 NO PROBLEMS

首先输出_1 情况然后输出_2情况..............

思路比较简单,先从0深搜一遍 看哪些不能到,输出

再重置下,然后枚举每条街道深搜 看能不能到0..

注意街道的编号不一定是按照顺序给出的...然后就是输出的次序是先_1在_2,并且街道的顺序要按输入的来.....

#include<stdio.h>#include<string.h>struct ss{    int to[1005];    int tot;}a[1015];int vis[1005];int order[1011];void dfs(int id){    vis[id]=1;    int tp=order[id];    for(int i=0;i<a[tp].tot;i++){        if(!vis[a[tp].to[i]])dfs(a[tp].to[i]);    }}   int main(){    int n,m,id[1010];    while(scanf("%d",&n)!=EOF){        memset(vis,0,sizeof(vis));        memset(id,0,sizeof(id));        memset(order,0,sizeof(order));        int flag=0;        for(int i=0;i<n;i++){            scanf("%d %d",&id[i],&a[i].tot);            for(int j=0;j<a[i].tot;j++){                scanf("%d",&a[i].to[j]);            }            order[id[i]]=i;        }        for(int i=0;i<n;i++){            memset(vis,0,sizeof(vis));            dfs(id[i]);            if(!vis[0]){                printf("TRAPPED %d\n",id[i]);                flag++;            }        }        memset(vis,0,sizeof(vis));        dfs(0);        for(int i=0;i<n;i++){            if(!vis[id[i]]){                printf("UNREACHABLE %d\n",id[i]);                flag++;            }        }        if(!flag)printf("NO PROBLEMS\n");    }    return 0;}


另一种邻接表实现的..
int tot,head[1010];void in(int id,int to){    a[tot].id=id;    a[tot].to=to;    a[tot].next=head[id];    head[id]=tot++;}int v[1010];void dfs(int id){    v[id]=1;    for(int i=head[id];i!=-1;i=a[i].next){        if(!v[a[i].to])        dfs(a[i].to);    }}



原创粉丝点击