首页 > 其他 > 详细

HDU1269 迷宫城堡

时间:2016-06-02 19:36:25      阅读:112      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!