HDU1269 迷宫城堡

Posted SilverNebula

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU1269 迷宫城堡相关的知识,希望对你有一定的参考价值。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstring>
 6 using namespace std;
 7 const int mxn=20000;
 8 int top,stack[mxn];//
 9 bool inst[mxn];//在栈内标志 
10 int cnt,dnow;//强连通个数,当前时间 
11 int dfn[mxn],low[mxn];
12 vector<int> e[mxn];//邻接矩阵 
13 void clear(){
14     cnt=0;dnow=0;top=0;
15     memset(dfn,-1,sizeof(dfn));
16     memset(inst,false,sizeof(inst));
17     for(int i=1;i<mxn;i++) e[i].clear();
18 }
19 int n,m;
20 void tarjan(int s){//tarjan算法,s为源点
21     int v=0,i;
22     dfn[s]=++dnow;
23     low[s]=dnow;
24     inst[s]=1;
25     stack[++top]=s;
26     for(i=0;i<e[s].size();i++){
27         v=e[s][i];//到达点
28         if(dfn[v]==-1){
29             tarjan(v);
30             low[s]=min(low[v],low[s]);
31         }
32         else if(inst[v]){
33             low[s]=min(dfn[v],low[s]);
34         }
35     }
36     if(dfn[s]==low[s]){
37         cnt++;
38         do{
39             v=stack[top--];
40             inst[v]=false;
41         }while(v!=s);
42     }
43     return;
44 }
45 int main(){
46     while(scanf("%d%d",&n,&m) && n && m ){
47         clear();
48         int i,j;
49         int u,v;
50         for(i=1;i<=m;i++){
51             scanf("%d%d",&u,&v);
52             e[u].push_back(v);
53         }
54         for(i=1;i<=n;i++){
55             if(dfn[i]==-1)tarjan(i);
56         }
57         if(cnt==1)printf("Yes\n");
58         else printf("No\n");
59     }
60     return 0;
61 }

WA中,存个代码

以上是关于HDU1269 迷宫城堡的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1269 迷宫城堡

HDU 1269 迷宫城堡(DFS)

hdu 1269 迷宫城堡

HDU1269 迷宫城堡

HDU 1269:迷宫城堡(强连通)

hdu1269 迷宫城堡强连通分量