HDU 1269.迷宫城堡-Tarjan or 双向DFS
迷宫城堡
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20476 Accepted Submission(s): 8917
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
No
#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的更多相关文章
- hdu 1269 迷宫城堡 (tarjan)
迷宫城堡Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU 1269 迷宫城堡 tarjan算法求强连通分量
基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等, ...
- HDU 1269 迷宫城堡(强连通)
HDU 1269 迷宫城堡 pid=1269" target="_blank" style="">题目链接 题意:中文题 思路:强连通模板题 代 ...
- hdu 1269 迷宫城堡
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个 ...
- HDU 1269 迷宫城堡(判断有向图强连通分量的个数,tarjan算法)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 1269 迷宫城堡(DFS)
迷宫城堡 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的 ...
- HDU 1269 迷宫城堡(向量)(Tarjan模版题)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 1269 迷宫城堡 强连通分量
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 1269 迷宫城堡 最简单的联通图题 kosaraju缩点算法
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Des ...
随机推荐
- Codeforces Round #462 (Div. 2) A Compatible Pair
A. A Compatible Pair time limit per test1 second memory limit per test256 megabytes Problem Descript ...
- Nodejs-模块化结构
1.模块(一个文件就是一个模块) 获取当前脚本所在的路径 _ _dirname 文件路径 _ _filename (1)创建模块(module1.js) const fs=require('fs'); ...
- IOS开发---菜鸟学习之路--(六)-UITableView几个方法的使用说明
对于UITableView的基础使用我这边就不做重复介绍了 我重点就来介绍下如何实现大部分新闻的界面.也就是第一条记录显示大图片下面加一段文字说明 然后剩下来的内容全部显示为文字图片的格式 其实要做到 ...
- Python 3.6 性能测试框架Locust安装及使用
背景 Python3.6 性能测试框架Locust的搭建与使用 基础 python版本:python3.6 开发工具:pycharm Locust的安装与配置 点击“File”→“setting” 点 ...
- 【LeetCode】移除元素(Remove Element)
这道题是LeetCode里的第27道题. 题目描述: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原 ...
- DNS 劫持、HTTP 劫持与 DNS 污染
本文为本人的学习笔记,不保证正确. DNS 劫持 指DNS服务器被控制,查询DNS时,服务器直接返回给你它想让你看的信息.这种问题常为 ISP 所为. 由于一般的的电脑的 DNS 服务器 的配置都为自 ...
- Gym100623A Access Control Lists
Gym 100623A Access Control Lists 这个题很sb啊,就是去设置个交换机 我们可以给一个IP进行设置,也可以对一个网段就行设置,但是IP是优于网段的,比如样例的第一个 网段 ...
- Eureka 简介以及简单示例(创建EurekaServer工程)
Eureka 是一款开源的服务注册与发现组件,通过配合其他组件可提供负载均衡能力. 服务发现类型的技术对比: 名称 类型 AP/CP 语言 依赖 集成 一致性算法 Eureka General AP ...
- js验证密码强弱
JS密码强度验证 <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...
- Unity开发VR——Oculus Rif_将Oculus接入Unity
该文档基于 Unity2018.3.12f1 1. 搭建简单场景 2. 设置,选择 Edit - Project Setting(若已经勾选,就去掉在勾选一次) 完成该步骤之后,可以带上Oculus头 ...