迷宫城堡

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20476    Accepted Submission(s): 8917

Problem Description
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。
 
Input
输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。
 
Output
对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。
 
Sample Input
3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
 
Sample Output
Yes
No
 
Author
Gardon
 
Source
 
 
 
代码1:Tarjan
 #include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
using namespace std;
const int N=1e5+;
stack<int>sta;
vector<int>gra[N];
int dfn[N],low[N],InStack[N];
vector<int>Component[N];
int InComponent[N];
int index,ComponentNumber;
int n,m;
void init(){
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(InStack,,sizeof(InStack));
index=ComponentNumber=;
for(int i=;i<=n;i++){
gra[i].clear();
Component[i].clear();
}
while(!sta.empty())
sta.pop();
}
void tarjan(int u){
InStack[u]=;
low[u]=dfn[u]=++index;
sta.push(u);
for(int i=;i<gra[u].size();++i){
int t=gra[u][i];
if(dfn[t]==){
tarjan(t);
low[u]=min(low[u],low[t]);
}
else if(InStack[t]==){
low[u]=min(low[u],dfn[t]);
}
}
if(low[u]==dfn[u]){
++ComponentNumber;
while(!sta.empty()){
int j=sta.top();
sta.pop();
InStack[j]=;
Component[ComponentNumber].push_back(j);
InComponent[j]=ComponentNumber;
if(j==u)break;
}
}
}
void input(){
for(int i=;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
gra[a].push_back(b);
}
}
void solve(){
for(int i=;i<=n;i++)
if(!dfn[i])tarjan(i);
if(ComponentNumber>)puts("No");
else puts("Yes");
}
int main(){
while(scanf("%d%d",&n,&m),n+m){
init();
input();
solve();
}
return ;
}

代码2:双向DFS

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = + ;
vector<int> node[maxn];
vector<int> reverse_node[maxn];
vector<int> reverse_post;
int marked[maxn];
int N,M; void reverse_dfs(int v){
marked[v] = ;
for(int w=;w<reverse_node[v].size();w++){
int to = reverse_node[v][w];
if(!marked[to]){
//cout<<"dfs="<<to<<endl;
reverse_dfs(to);
}
}
//cout<<"post in="<<v<<endl;
reverse_post.push_back(v);
} void get_reverse(){
reverse_post.clear();
for(int v=;v<=N;v++){
if(!marked[v]){
//cout<<"start="<<v<<endl;
reverse_dfs(v);
}
}
} void dfs(int v){
marked[v] = ;
for(int w=;w<node[v].size();w++){
int to = node[v][w];
if(!marked[to])dfs(to);
}
} int main(){
while(cin>>N>>M){
if(N+M==) break;
for(int i=;i<=N;i++){
node[i].clear();
reverse_node[i].clear();
marked[i]=;
}
for(int i=;i<M;i++){
int a,b;
scanf("%d%d",&a,&b);
node[a].push_back(b);
reverse_node[b].push_back(a);
}
get_reverse();
for(int i=;i<=N;i++){
marked[i] = ;
}
int num=;
for(int i=reverse_post.size()-;i>=;i--){
int to = reverse_post[i];
if(!marked[to]){
//cout<<"again dfs="<<to<<endl;
if(num==){
num=;
break;
}
dfs(to);
num++;
}
}
printf("%s\n",num==?"Yes":"No");
}
return ;
}

HDU 1269.迷宫城堡-Tarjan or 双向DFS的更多相关文章

  1. hdu 1269 迷宫城堡 (tarjan)

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

  2. HDU 1269 迷宫城堡 tarjan算法求强连通分量

    基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等, ...

  3. HDU 1269 迷宫城堡(强连通)

    HDU 1269 迷宫城堡 pid=1269" target="_blank" style="">题目链接 题意:中文题 思路:强连通模板题 代 ...

  4. hdu 1269 迷宫城堡

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个 ...

  5. HDU 1269 迷宫城堡(判断有向图强连通分量的个数,tarjan算法)

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

  6. HDU 1269 迷宫城堡(DFS)

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

  7. HDU 1269 迷宫城堡(向量)(Tarjan模版题)

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

  8. hdu 1269 迷宫城堡 强连通分量

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

  9. hdu 1269 迷宫城堡 最简单的联通图题 kosaraju缩点算法

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

随机推荐

  1. Codeforces Round #462 (Div. 2) A Compatible Pair

    A. A Compatible Pair time limit per test1 second memory limit per test256 megabytes Problem Descript ...

  2. Nodejs-模块化结构

    1.模块(一个文件就是一个模块) 获取当前脚本所在的路径 _ _dirname 文件路径 _ _filename (1)创建模块(module1.js) const fs=require('fs'); ...

  3. IOS开发---菜鸟学习之路--(六)-UITableView几个方法的使用说明

    对于UITableView的基础使用我这边就不做重复介绍了 我重点就来介绍下如何实现大部分新闻的界面.也就是第一条记录显示大图片下面加一段文字说明 然后剩下来的内容全部显示为文字图片的格式 其实要做到 ...

  4. Python 3.6 性能测试框架Locust安装及使用

    背景 Python3.6 性能测试框架Locust的搭建与使用 基础 python版本:python3.6 开发工具:pycharm Locust的安装与配置 点击“File”→“setting” 点 ...

  5. 【LeetCode】移除元素(Remove Element)

    这道题是LeetCode里的第27道题. 题目描述: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原 ...

  6. DNS 劫持、HTTP 劫持与 DNS 污染

    本文为本人的学习笔记,不保证正确. DNS 劫持 指DNS服务器被控制,查询DNS时,服务器直接返回给你它想让你看的信息.这种问题常为 ISP 所为. 由于一般的的电脑的 DNS 服务器 的配置都为自 ...

  7. Gym100623A Access Control Lists

    Gym 100623A Access Control Lists 这个题很sb啊,就是去设置个交换机 我们可以给一个IP进行设置,也可以对一个网段就行设置,但是IP是优于网段的,比如样例的第一个 网段 ...

  8. Eureka 简介以及简单示例(创建EurekaServer工程)

    Eureka 是一款开源的服务注册与发现组件,通过配合其他组件可提供负载均衡能力. 服务发现类型的技术对比: 名称 类型 AP/CP 语言 依赖 集成 一致性算法 Eureka General AP ...

  9. js验证密码强弱

    JS密码强度验证 <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...

  10. Unity开发VR——Oculus Rif_将Oculus接入Unity

    该文档基于 Unity2018.3.12f1 1. 搭建简单场景 2. 设置,选择 Edit - Project Setting(若已经勾选,就去掉在勾选一次) 完成该步骤之后,可以带上Oculus头 ...