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 ...
随机推荐
- utf8和utf8mb4区别
原文链接 一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.好在utf8mb4是utf8的超集,除了将编 ...
- hibernate实体xml一对多关系映射
单向一对多关系映射: 一个房间对应多个使用者,也就是Room實例知道User實例的存在,而User實例則沒有意識到Room實例. 用户表: package onlyfun.caterpillar; p ...
- Python框架之Django学习笔记(一)
Django历史: Django 是从真实世界的应用中成长起来的,它是由 堪萨斯(Kansas)州 Lawrence 城中的一个 网络开发小组编写的. 它诞生于 2003 年秋天,那时 Lawrenc ...
- iOS笔记052- Quartz2D-绘图
简介 Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘 ...
- _cdecl _stdcall
__cdecl程序的压栈方式为C风格__stdcall为PASCAL风格 举个例子:(1) C函数 Fun1(a,b,c) 函数调用时,参数压栈顺序为 c , b , a(2) PASC ...
- git放弃修改&放弃增加文件
1. 本地修改了一堆文件(并没有使用git add到暂存区),想放弃修改. 单个文件/文件夹: git checkout -- filename 所有文件/文件夹: git checkout . 2. ...
- hdu 4176
Class Statistics Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Kotlin-Not enough information to infer parameter T in fun<T:View> findViewById(id: Int): T!
代码改变世界 错误: Type inference failed : Not enough information to infer parameter T in fun<T:View> ...
- 在iBatis中操作Blob数据类型
这里的Blob数据类型指的是保存了文本的blob数据类型 直接读取blob类型存储的文本,可能会出现乱码,所以需要读取完后进行手动转码 这里使用ibatis作为持久层 SELECT urlconten ...
- JavaWeb开发小结
JavaWeb开发是B/S开发的一种,其他语言也可以实现,就前台而言,一直都是HTML.CSS.JavaScript 后台语言可以是Perl.Python.PHP.Java等等 Java机缘巧合在We ...