• 迷宫城堡--HDOJ 1269


    迷宫城堡

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 5730    Accepted Submission(s): 2542


    Problem Description
    为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。
     
    Input
    输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。
     
    Output
    对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。
     
    Sample Input
    3 3 1 2 2 3 3 1 3 3 1 2 2 3 3 2 0 0
     
    Sample Output
    Yes No
     
    思路:这是图的强连通性问题的裸题,入门题,我用的是Kosaraju算法:
        1.从第一个点开始对全图进行第一次深度优先搜索 DFS1(),形成一棵树或者森林;
        2.按照DFS1()回溯时点的顺序对反图进行第二次深度优先搜索DFS2(),形成一棵树或者森林;
    因此在DFS1()时必须记录点被搜索的先后顺序!
    对全图进行了两次DFS之后就可以知道图的强连通性,求得强连通分量,若分量个数为1,说明图是一个强连通图。
    AC代码:
     1 //*************************************************************************//
     2 //    Author: wangzhili
     3 //     Mail:   wangstdio.h@gmail.com
     4 //    Filename: qlt.c
     5 //     Last modified: 2013-12-04 21:19
     6 //*************************************************************************//
     7 
     8 #include<stdio.h>
     9 #include<string.h>
    10 typedef struct
    11 {
    12     int to;
    13     int next;
    14 }EdgeNode;
    15 EdgeNode edge[100005],redge[100005];
    16 int head[10005],rhead[10005];
    17 int vis[10005];
    18 int t[10005];
    19 int cnt;
    20 void creatmap(int a,int b,int i)
    21 {
    22     edge[i].to = b;
    23     edge[i].next = head[a];
    24     head[a] = i;
    25     redge[i].to = a;
    26     redge[i].next = rhead[b];
    27     rhead[b] = i;
    28 }
    29 
    30 void dfsone(int v)
    31 {
    32     int j;
    33     vis[v] = 1;
    34     for(j = head[v];j != -1;j = edge[j].next)
    35     {
    36         if(!vis[edge[j].to])
    37             dfsone(edge[j].to);
    38     }
    39     t[++cnt] = v;
    40 }
    41 
    42 void dfstwo(int v)
    43 {
    44     int j;
    45     vis[v] = 1;
    46     for(j = rhead[v];j != -1;j = redge[j].next)
    47     {
    48         if(!vis[redge[j].to])
    49             dfstwo(redge[j].to);
    50     }
    51 }
    52 
    53 int main()
    54 {
    55     int n,m,i,j;
    56     int a,b;
    57     //freopen("/home/acmer/桌面/in.c","r",stdin);
    58     while(~scanf("%d%d",&n,&m) && (m+n))
    59     {
    60         cnt = 0;
    61         memset(head,-1,sizeof(head));
    62         memset(rhead,-1,sizeof(redge));
    63         memset(vis,0,sizeof(vis));
    64         memset(t,0,sizeof(t));
    65         for(i = 0;i < m;i ++)
    66         {
    67             scanf("%d%d",&a,&b);
    68             creatmap(a,b,i);
    69         }
    70         for(i = 1;i <= n;i ++)
    71         {
    72             if(!vis[i])
    73                 dfsone(i);
    74         }
    75         memset(vis,0,sizeof(vis));
    76         cnt = 0;
    77         for(i = n;i >= 1;i --)
    78         {
    79             if(!vis[t[i]])
    80             {
    81                 dfstwo(t[i]);
    82                 cnt++;
    83             }
    84         }
    85         if(cnt == 1)
    86             printf("Yes
    ");
    87         else
    88             printf("No
    ");
    89     }
    90     return 0;
    91 }
     
     
     
  • 相关阅读:
    mybatis ForEach Collection集合等规范解析(转)
    IntelliJ IDEA怎么安装
    django数据库基本操作-增删改查(tip)-基本
    解决Django中在.js文件中用ajax请求后端,找不到CSRF问题
    jQuery判断当前元素是第几个元素&获取第N个元素
    python 判断字符串是否为空用什么方法?
    jq 跳转方式汇总
    SwitchOmega的详细配置——for Windows
    ubuntu怎用使用命令搜索软件源中的软件
    ubuntu16.04中文乱码解决方案
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3458382.html
Copyright © 2020-2023  润新知