hdu1269迷宫城堡(判断有向图是否是一个强连通图)
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迷宫城堡(判断有向图是否是一个强连通图)的更多相关文章
- HDU1269迷宫城堡(裸Tarjan有向图求强连通分量个数)
迷宫城堡Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDOJ迷宫城堡(判断强连通 tarjan算法)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- HDU 1269 -- 迷宫城堡【有向图求SCC的数目 && 模板】
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU1269 迷宫城堡 —— 强连通分量
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) M ...
- HDU-1269 迷宫城堡(连通分量)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU1269 迷宫城堡 2016-07-24 13:47 84人阅读 评论(0) 收藏
迷宫城堡 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的 ...
- HDU1269 迷宫城堡
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- hdu1269迷宫城堡 (强连通Tarjan+邻接表)
Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每一个通道都是单向的,就是说 ...
- HDU1269 迷宫城堡(裸强连通分量)
Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A ...
随机推荐
- Sql Servicer 复习笔记(1) 存储过程分布
第一步:创建表 declare @countInt int declare @age int ) begin ),@countInt), @age,'中国北京') ; ; ) begin ; end ...
- java基础3_流程控制语句
一 条件判断 1. 条件运算符(三元表达式) ,其形式为: type d = a ? b : c; 具体化形式为:int d = 2 < 1 ? 3 : 4; 2. 轻量级的文本编辑器:Ultr ...
- android 编译代码注意事项
1 安装openjdk1.7 sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-apt update sudo apt-get install op ...
- iOS CGContextRef画图时的常用方法
UIView的drawRect方法 CoreGraphics绘图 综述:描述系统会调用UIView的drawRect方法,所以coreGraphics的所有实现代码放在该函数内,setNeedsDis ...
- 桌面 透明 三角形 分层窗口 DX
//桌面 透明 三角形 分层窗口 DX //IDirect3DSurface9 GetDC UpdateLayeredWindow #include <Windows.h> #includ ...
- Asp.net web form url route使用总结
asp.net web form 使用URL路由 注不是mvc中的路由 一.前台控件使用路由,通过表达式生成url地址,注意给路由参数赋值,防止使用了其他路由表达式值方式1:<asp:Hyper ...
- vCPU估算的几个基本概念
物理CPU数量:实际服务器插槽上的CPU个数: 核:一块CPU上面能处理数据的芯片组的数量: 超线程:在一个实体芯片组中提供两个逻辑线程: 逻辑CPU数量:物理CPU数量*核*超线程(若支持超线程,该 ...
- json-smart 使用示例(推荐fastjson)
关于json库,请使用fastjson,这是我用过的最好用的json库! 地址:https://github.com/alibaba/fastjson ======================== ...
- js模版引擎handlebars.js实用教程——由于if功力不足引出的Helper
返回目录 <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content=" ...
- 翻译-Salt与Ansible全方位比较
原文链接:http://jensrantil.github.io/salt-vs-ansible.html 作者: Jens Rantil 之前某些时候我需要评估配置管理系统.结合从他人得到的意见,我 ...