zoukankan      html  css  js  c++  java
  • HDU 1629 迷宫城堡

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1269

    解题思路:

    如果整个图只有一个连通分量输出“Yes”,其它就输出“NO”

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <vector>
     6 #include <algorithm>
     7 using namespace std;
     8 
     9 const int MAXN=100010;
    10 const int MAXM=2000010;
    11 
    12 struct Edge{
    13     int to,next;
    14 }edges[MAXM];
    15 int head[MAXN],tot;
    16 
    17 void init(){
    18     memset(head,-1,sizeof(head));
    19     tot=0;
    20 }
    21 
    22 void addEdge(int u,int v){
    23     edges[tot].to=v;
    24     edges[tot].next=head[u];
    25     head[u]=tot++;
    26 }
    27 
    28 int DFN[MAXN],LOW[MAXN],Belong[MAXN],Stack[MAXN];
    29 int Index,top;
    30 int scc;
    31 bool Instack[MAXN];
    32 int num[MAXN];
    33 
    34 void Tarjan(int u){
    35     int v;
    36     LOW[u]=DFN[u]=++Index;
    37     Stack[top++]=u;
    38     Instack[u]=true;
    39 
    40     for(int i=head[u];i!=-1;i=edges[i].next){
    41         v=edges[i].to;
    42 
    43         if(!DFN[v]){
    44             Tarjan(v);
    45             if(LOW[u]>LOW[v]) LOW[u]=LOW[v];
    46         }else if(Instack[v]&&LOW[u]>DFN[v])
    47             LOW[u]=DFN[v];
    48     }
    49 
    50     if(LOW[u]==DFN[u]){
    51         scc++;
    52 
    53         do{
    54             v=Stack[--top];
    55             Instack[v]=false;
    56             num[scc]++;
    57             Belong[v]=scc;
    58         }while(v!=u);
    59     }
    60 }
    61 
    62 void solve(int N){
    63     memset(DFN,0,sizeof(DFN));
    64     memset(Instack,false,sizeof(Instack));
    65     memset(num,0,sizeof(num));
    66 
    67     Index=top=scc=0;
    68 
    69     for(int i=1;i<=N;i++){
    70         if(!DFN[i])
    71             Tarjan(i);
    72     }
    73 
    74     if(scc>1)
    75         cout<<"No"<<endl;
    76     else
    77         cout<<"Yes"<<endl;
    78 }
    79 
    80 int main(){
    81     int n,m;
    82     while(scanf("%d%d",&n,&m)!=EOF&&(n!=0||m!=0)){
    83             init();
    84         for(int i=0;i<m;i++){
    85             int u,v;
    86             scanf("%d%d",&u,&v);
    87             addEdge(u,v);
    88         }
    89         solve(n);
    90     }
    91 
    92 }
    自己选的路,跪着也要把它走完------ACM坑
  • 相关阅读:
    Delphi中的钩子函数HOOK详解
    Delphi好书推荐
    Windows通知栏图标高级编程概述
    关于开机自动运行程序和自动启动服务
    如何在一个窗体中嵌入另一个窗体
    三层中如何在服务器与客户端之间传输自定义的'Record'类型数据的例子
    Delphi中的钩子函数HOOK详解
    STL(转)
    默认参数(c++)
    STL2
  • 原文地址:https://www.cnblogs.com/IKnowYou0/p/6531870.html
Copyright © 2011-2022 走看看