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坑
  • 相关阅读:
    LeetCode 121. Best Time to Buy and Sell Stock
    LeetCode 221. Maximal Square
    LeetCode 152. Maximum Product Subarray
    LeetCode 53. Maximum Subarray
    LeetCode 91. Decode Ways
    LeetCode 64. Minimum Path Sum
    LeetCode 264. Ugly Number II
    LeetCode 263. Ugly Number
    LeetCode 50. Pow(x, n)
    LeetCode 279. Perfect Squares
  • 原文地址:https://www.cnblogs.com/IKnowYou0/p/6531870.html
Copyright © 2011-2022 走看看