• HDOJ1269 迷宫城堡[强连通分量]


    迷宫城堡

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


    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
     
    Author
    Gardon
     
    Source
     
    Recommend
    lxj
     
     
     
     
     
     
     
     
     
    强连通图的模版题
    code:
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<vector>
     4 #include<stack>
     5 using namespace std;
     6 
     7 #define min(c,d) ((c)<(d)?(c):(d))
     8 #define M 10010
     9 
    10 int low[M],bfn[M],m,n,cnt,cat;
    11 bool vit[M];
    12 vector<int>map[M];
    13 stack<int>S;
    14 
    15 void tarjan(int x)
    16 {
    17     low[x]=bfn[x]=++cnt;
    18     vit[x]=true;
    19     S.push(x);
    20     for(int i=0;i<map[x].size();i++)
    21     {
    22         int t=map[x][i];
    23         if(!low[t])
    24         {
    25             tarjan(t);
    26             low[x]=min(low[x],low[t]);
    27         }
    28         else if(vit[t])
    29             low[x]=min(low[x],bfn[t]);
    30     }
    31     if(low[x]==bfn[x])
    32     {
    33         cat++;
    34         while(!S.empty())
    35         {
    36             int t=S.top();
    37             S.pop();
    38             vit[t]=false;
    39             if(x==t)
    40                 break;
    41         }
    42     }
    43 }
    44 
    45 int main()
    46 {
    47     while(~scanf("%d%d",&n,&m),n+m)
    48     {
    49         while(!S.empty())
    50             S.pop();
    51         for(int i=1;i<=n;i++)
    52             map[i].clear();
    53         memset(low,0,sizeof(low));
    54         memset(bfn,0,sizeof(bfn));
    55         memset(vit,false,sizeof(vit));
    56         cnt=cat=0;
    57         for(int i=0;i<m;i++)
    58         {
    59             int a,b;
    60             scanf("%d%d",&a,&b);
    61             map[a].push_back(b);
    62         }
    63         for(int i=1;i<=n;i++)
    64             if(!bfn[i])
    65                 tarjan(i);
    66         if(cat>1)
    67             printf("No\n");
    68         else
    69             printf("Yes\n");
    70     }
    71     return 0;
    72 }

    注:

        第一次用vector写,注意下几个常用的操作的写法。

    #include<vector>

    using namespace std;

    vector<int>map[M];

    map[a].push_back(b);

    vector<int> test;//建立一个vector

    test.push_back(1);

    test.push_back(2);//把1和2压入vector 这样test[0]就是1,test[1]就是2

  • 相关阅读:
    jython resources
    Installing a Library of Jython ScriptsPart of the WebSphere Application Server v7.x Administration Series Series
    jython好资料
    ulipad install on 64bit win7 has issue
    an oracle article in high level to descibe how to archtichre operator JAVA relevet project
    table的宽度,单元格内换行问题
    Linux常用命令大全
    dedecms系统后台登陆提示用户名密码不存在
    登录织梦后台提示用户名不存在的解决方法介绍
    Shell常用命令整理
  • 原文地址:https://www.cnblogs.com/XBWer/p/2624102.html
Copyright © 2020-2023  润新知