码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1269 迷宫城堡

时间:2016-06-02 19:37:16      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

 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 迷宫城堡

标签:

原文地址:http://www.cnblogs.com/SilverNebula/p/5554069.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!