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 ...
随机推荐
- I2C总线协议图解(转载)
转自:http://blog.csdn.net/w89436838/article/details/38660631 另外,https://blog.csdn.net/qq_38410730/arti ...
- 【转载】2015年8月编程语言排行榜:Java遥遥领先
Java以4.5%的差距遥遥领先于第二名,回顾以前Java有这样的成绩还是在2008年.Java version 8的成功主要是因为函数式编程习语的添加.Java出现下滑是在2010年 Oracle收 ...
- mysql不能登陆
前些天还正常运行的mysql,不知怎么就不能登陆了.错误提示为 :ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (1 ...
- leetcode 【 Subsets 】python 实现
题目: Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset mus ...
- android抓取logcat日志的方法
这几天帮忙测试一个APP,报告结果需要提交日志文件,于是百度了下安卓的获取日志方法,其实很简单,7个步骤搞定,下面把我的总结分享给大家. 1.下载adb工具包 https://pan.baidu.co ...
- 【LeetCode】Excel Sheet Column Number(Excel表列序号)
这道题是LeetCode里的第171道题. 题目描述: 给定一个Excel表格中的列名称,返回其相应的列序号. 例如, A -> 1 B -> 2 C -> 3 ... Z -> ...
- Visual C++ 连连看游戏源代码
点击下载
- Java之implements
转自:https://blog.csdn.net/android_lover2014/article/details/52176814 JAVA中extends 与implements有啥区别?1. ...
- AlloyClip的简单使用
<!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [LOJ#2323]「清华集训 2017」小Y和地铁
[LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...