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中,存个代码

时间: 2024-12-14 07:14:08

HDU1269 迷宫城堡的相关文章

hdu1269 迷宫城堡,有向图的强连通分量 , Tarjan算法

hdu1269 迷宫城堡 验证给出的有向图是不是强连通图... Tarjan算法板子题 Tarjan算法的基础是DFS,对于每个节点.每条边都搜索一次,时间复杂度为O(V+E). 算法步骤: 1.搜索到某一个点时,将该点的Low值标上时间戳,然后将自己作为所在强连通分量的根节点(就是赋值Dfn=Low=time) 2.将该点压入栈. 3.当点p有与点p'相连时,如果此时p'不在栈中,p的low值为两点的low值中较小的一个. 4.当点p有与点p'相连时,如果此时p'在栈中,p的low值为p的lo

hdu1269迷宫城堡 (强连通Tarjan+邻接表)

Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i. Input 输入包含多组数据,输

HDU1269迷宫城堡(裸Tarjan有向图求强连通分量个数)

迷宫城堡Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13833    Accepted Submission(s): 6174 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房

HDU1269 迷宫城堡(强连通图+Tarjan)

Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i. Input 输入包含多组数据,输

HDU1269 迷宫城堡 (强连通图判定)

题意:判定给出的有向图是不是强连通图 Tarjan算法模板题目 #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<set> #include<map> #include<string> #include<cstring> #include<stack> #include<queue&

HDU1269迷宫城堡

Tarjan算法解读:https://www.byvoid.com/zht/blog/scc-tarjan 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cstring> 5 #include<vector> 6 #include<stack> 7 #include<algorithm> 8 using namespace st

迷宫城堡 -- 强联通分量

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10908    Accepted Submission(s): 4887 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

hdoj 1269 迷宫城堡【scc基础题目】

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10156    Accepted Submission(s): 4570 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A

hdu 1269 迷宫城堡 强连通分量

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12778    Accepted Submission(s): 5698 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A