1
/*
题意: 给你一个图,求这个有向图示否是一个强连通图(每两个节点都是可以相互到达的)!
思路1:按正向边dfs一遍,将经过的节点计数,如果记录的节点的个数小于n,那么就说明图按照正向边就不是连同的,所以就不是强连通图!
然后按照反向边再进行另一个dfs,同样对经过的节点的个数进行计数,如果个数==n则说明正向遍历和反响遍历都是连通的!那么整个图就是强连通的图! 思路2:直接套用tarjan算法,求出每一个节点所对应的缩点的值, 如果缩点的个数==1,那么证明就会只有一个强连通分量!也就是强连通图 思路3:多次次调用tarjan算法,判断low[u]==pre[u]&&u==1, 如果不满足说明改图有多个缩点,那就不是强连通图!下图说明一下....


     */
//思路一:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define N 10005
using namespace std; vector<int>uv[N];
vector<int>vu[N]; int vis[N]; int cnt; int n, m; void dfs1(int u){
vis[u]=1;
++cnt;
int len=uv[u].size();
for(int i=0; i<len; ++i){
int v=uv[u][i];
if(!vis[v])
dfs1(v);
}
} void dfs2(int v){
vis[v]=1;
++cnt;
int len=vu[v].size();
for(int i=0; i<len; ++i){
int u=vu[v][i];
if(!vis[u])
dfs2(u);
}
} int main(){
while( scanf("%d%d", &n, &m) && (n||m) ){
memset(vis, 0, sizeof(vis));
for(int i=1; i<=n; ++i){
uv[i].clear();
vu[i].clear();
}
while(m--){
int u, v;
scanf("%d%d", &u, &v);
uv[u].push_back(v);
vu[v].push_back(u);
}
cnt=0;
dfs1(1); if(cnt==n){
memset(vis, 0, sizeof(vis));
cnt=0;
dfs2(1);
if(cnt!=n)
printf("No\n");
else printf("Yes\n");
}
else printf("No\n"); }
return 0;
}
 //思路二:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<stack>
#define N 10005
using namespace std; vector<int>g[N];
stack<int>s;
int pre[N], low[N];
int scc[N];
int scc_cnt;
int dfs_clock; void tarjans(int u){
pre[u]=low[u]=++dfs_clock;
s.push(u);
int len=g[u].size();
for(int i=; i<len; ++i){
int v=g[u][i];
if(pre[u]>pre[v]){
if(!pre[v]){
tarjans(v);
low[u]=min(low[v], low[u]);
}
else
low[u]=min(pre[v], low[u]);
}
} if(low[u]==pre[u]){
++scc_cnt;
while(){
int x=s.top();
s.pop();
scc[x]=scc_cnt;
if(x==u) break;
}
}
} int n, m;
int main(){
while(scanf("%d%d", &n, &m) && (n||m)){
while(m--){
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
}
dfs_clock=;
scc_cnt=;
for(int i=; i<=n; ++i)
if(!scc[i])
tarjans(i);
int i;
for(i=; i<=n; ++i)
if(scc[i]!=scc[]){
printf("No\n");
break;
}
if(i>n) printf("Yes\n");
memset(pre, , sizeof(pre));
memset(low, , sizeof(low));
memset(scc, , sizeof(scc));
for(i=; i<=n; ++i)
g[i].clear();
}
return ;
}
 //思路三:
1 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define N 10005
using namespace std; vector<int>g[N];
bool flag;
int pre[N], low[N];
int dfs_clock; void tarjans(int u){
pre[u]=low[u]=++dfs_clock;
int len=g[u].size();
for(int i=; i<len; ++i){
int v=g[u][i];
if(!flag) return ;
if(pre[u]>pre[v]){
if(!pre[v]){
tarjans(v);
low[u]=min(low[v], low[u]);
}
else
low[u]=min(pre[v], low[u]);
}
} if(low[u]==pre[u] && u!=)
flag=false;
} int n, m;
int main(){
while(scanf("%d%d", &n, &m) && (n||m)){
while(m--){
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
}
dfs_clock=;
flag=true;
for(int i=; i<=n; ++i)
if(!pre[i]){
if(!flag) break;
tarjans(i);
} if(!flag) printf("No\n");
else printf("Yes\n");
memset(pre, , sizeof(pre));
memset(low, , sizeof(low));
for(int i=; i<=n; ++i)
g[i].clear();
}
return ;
}


hdu1269迷宫城堡(判断有向图是否是一个强连通图)的更多相关文章

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

    迷宫城堡Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  2. HDOJ迷宫城堡(判断强连通 tarjan算法)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  3. HDU 1269 -- 迷宫城堡【有向图求SCC的数目 &amp;&amp; 模板】

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. HDU1269 迷宫城堡 —— 强连通分量

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    M ...

  5. HDU-1269 迷宫城堡(连通分量)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. HDU1269 迷宫城堡 2016-07-24 13:47 84人阅读 评论(0) 收藏

    迷宫城堡 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的 ...

  7. HDU1269 迷宫城堡

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

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

    Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每一个通道都是单向的,就是说 ...

  9. HDU1269 迷宫城堡(裸强连通分量)

    Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A ...

随机推荐

  1. static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数

    C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域. 从作用域看: 全局变量具有全局作用域.全局变量只需在一个源文件 ...

  2. php CLI 模式下的传参方法

    在CLI模式(命令行界面 Command Line Interface)下,传入参数有如下3种方法: 一. getopt函数(PHP 4 >= 4.3.0, PHP 5) getopt - 从命 ...

  3. 第一次自己写jquery图片延迟加载插件,不通用,但修改一下还是可以使用到很多页面上的

    不断修改完善中…… /*! * jquery.lazyoading.js *自定义的页面图片延迟加载插件,比网上的jquery.lazyload简单,也更适合自己的网站 *使用方法: 把img 的cl ...

  4. Replication的犄角旮旯(五)--关于复制identity列

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  5. SqlServerProxy的一些资料

    SqlServerProxy的一些资料 下载地址:http://files.cnblogs.com/files/lyhabc/SqlServerProxy.rar 1.特性及实现原理 SqlServe ...

  6. MySQL7:视图

    什么是视图 数据库中的视图是一个虚拟表.视图是从一个或者多个表中导出的表,视图的行为与表非常相似,在视图中用户可以使用SELECT语句查询数据,以及使用INSERT.UPDATE和DELETE修改记录 ...

  7. 使用SQL生成DateTime.Ticks

    在项目中我需要使用到一个随机数(Random Number),该随机数将作为 Hashtable 中的 Key 用于唯一索引数据,所以需要保持单机唯一性. 同时该随机数还需要具备可排序性以便对数据进行 ...

  8. WPF,Silverlight与XAML读书笔记第四十六 - 外观效果之三皮肤与主题

    说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. 皮肤 皮肤是应用程序中样式与模板的集合,可以 ...

  9. Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制

    一.事件的捕获与冒泡 由W3C规定的DOM2标准中,一次事件的完整过程包括三步:捕获→执行目标元素的监听函数→冒泡,在捕获和冒泡阶段,会依次检查途径的每个节点,如果该节点注册了相应的监听函数,则执行监 ...

  10. Intellij Idea 2016 配置Tomcat虚拟目录

    默认的idea是不需要配置虚拟目录了,它完全托管项目,但是有些时候,在开发过程中,是需要以虚拟目录的形式开发,即以:http://localhost:8080/虚拟目录名/index.html 这种形 ...