迷宫城堡(强联通targin)
迷宫城堡
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10409 Accepted Submission(s): 4674
了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单
向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请
你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间
i。
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
using namespace std;
#define MAX(x,y)(x>y?x:y)
#define MIN(x,y)(x<y?x:y)
//#define LOCAL
const int INF=0x3f3f3f3f;
const int MAXN=;
vector<int>vec[MAXN];
int vis[MAXN];
void dfs(int x){
for(int i=;i<vec[x].size();i++){
int v=vec[x][i];
if(vis[v])continue;
vis[v]=;
dfs(v);
}
}
int main(){
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
int N,M;
while(~scanf("%d%d",&N,&M),N|M){
for(int i=;i<MAXN;i++)vec[i].clear();
while(M--){
int a,b;
scanf("%d%d",&a,&b);
vec[a].push_back(b);
}
int ans=;
for(int i=;i<=N;i++){
memset(vis,,sizeof(vis));
vis[i]=;
dfs(i);
for(int i=;i<=N;i++){
if(vis[i]==){
ans=;
break;
}
if(!ans)break;
}
if(!ans)break;
}
if(ans)puts("Yes");
else puts("No");
}
return ;
}
方法二:targin算法:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=;
//#define LOCAL
vector<int>vec[MAXN];
stack<int>S;
int dfn[MAXN],low[MAXN],Instack[MAXN];
int scc,dfs_block;
void targin(int u,int fa){
dfn[u]=low[u]=++dfs_block;
S.push(u);
Instack[u]=;
for(int i=;i<vec[u].size();i++){
int v=vec[u][i];
if(!dfn[v]){
targin(v,u);
low[u]=min(low[u],low[v]);
}
else if(Instack[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
scc++;
while(){
int v=S.top();
S.pop();
Instack[v]=;
if(u==v)break;
}
}
}
int main(){
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
int N,M;
while(~scanf("%d%d",&N,&M),N|M){
for(int i=;i<MAXN;i++)vec[i].clear();
mem(dfn,);mem(low,);mem(Instack,);
while(!S.empty())S.pop();
int a,b;
while(M--){
scanf("%d%d",&a,&b);
vec[a].push_back(b);
}
scc=dfs_block=;
for(int i=;i<=N;i++){
if(dfn[i])continue;
targin(i,-);
}
if(scc==)puts("Yes");
else puts("No");
}
return ;
}
邻接表建图又写了一遍,邻接表都不太熟练了:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
//#define LOCAL
#define mem(x,y) memset(x,y,sizeof(x))
const int MAXN=;
const int MAXM=;//<<1;
int head[MAXM],low[MAXN],dfn[MAXN],Instack[MAXN];
int edgnum,dfs_block,lcc;
stack<int>S;
struct Edge{
int from,to,next;
};
Edge edg[MAXM];
void add(int u,int v){
Edge E={u,v,head[u]};
edg[edgnum]=E;
head[u]=edgnum++;//**
}
void targin(int u,int fa){
low[u]=dfn[u]=++dfs_block;
S.push(u);
Instack[u]=;
for(int i=head[u];i!=-;i=edg[i].next){//**
int v=edg[i].to;
if(!dfn[v]){
targin(v,u);
low[u]=min(low[v],low[u]);
}
else if(Instack[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]){
lcc++;
while(){
int v=S.top();
S.pop();
Instack[v]=;
if(u==v)break;
}
}
}
int main(){
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
int N,M;
while(~scanf("%d%d",&N,&M),N|M){
mem(head,-);mem(dfn,);mem(low,);mem(Instack,);
edgnum=dfs_block=lcc=;
while(!S.empty())S.pop();
int a,b;
while(M--){
scanf("%d%d",&a,&b);
add(a,b);
}
for(int i=;i<=N;i++){
if(dfn[i])continue;
targin(i,-);
}
if(lcc==)puts("Yes");
else puts("No");
}
return ;
}
迷宫城堡(强联通targin)的更多相关文章
- 【强联通图 | 强联通分量】HDU 1269 迷宫城堡 【Kosaraju或Tarjan算法】
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明 ...
- HDU 1269 迷宫城堡 【强联通分量(模版题)】
知识讲解: 在代码里我们是围绕 low 和 dfn 来进行DFS,所以我们务必明白 low 和 dfn 是干什么的? 有什么用,这样才能掌握他. 1. dfn[] 遍历到这个点的时间 2. ...
- hdu 1269 迷宫城堡(Targin算法)
---恢复内容开始--- 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu 1269 迷宫城堡 最简单的联通图题 kosaraju缩点算法
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Des ...
- hdu 1269 迷宫城堡
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个 ...
- 有向图的强联通tarjan算法(判断是否为强联通模板)(hdu1269)
hdu1269 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- 迷宫城堡+算法讲解【tarjian算法】
Tarjan 算法 参考博客:https://www.cnblogs.com/shadowland/p/5872257.html 算法讲解 Tarjan 算法一种由Robert Tarjan提出的求解 ...
- 迷宫城堡--HDOJ 1269
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdoj 1269 迷宫城堡【scc基础题目】
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- css3之border-color
-moz-border-top-colors:上边框-moz-border-right-colors:右边框-moz-border-bottom-colors:下边框-moz-border-left- ...
- 游戏中网络数据包和HTTP数据的思考
快下班了,对于这个沙盒类文字游戏,其实考虑的东西还是很多的,服务器的架构,NPC, NPC API的运算,等等等 现在在思考大数据传输,比如背包数据或者拍卖行的商品展示数据在传输的时候的性能问题 目前 ...
- Scala类型声明与定义、函数定义、流程控制、异常处理
Scala源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库. Scala的基础类型基本与javascript一致. Scala的数据类型全部相同于Java中,具有 ...
- Arduino当avr开发板
原理并不复杂,因为arduino本来就是avr+一堆的库,找个能编译出hex的工具下载到板子就行. 但实际做起来还是碰到很多问题. 先是尝试eclipse+avr plugin 编译时出现make: ...
- php面向对象编程学习之高级特性
前几天写了一篇关于php面向对象基础知识的博客,这两天看了php面向对象的高级特性,写出来记录一下吧,方便以后拿出来复习. 面向对象除了最基本的定义类之外,最主要就是因为面向的一些高级特性,运用这些高 ...
- sublime text 插件开发
前言:术语和参考资料 sublime text 2的扩展模式相当的丰富.有多种方法可以修改语法高亮模式以及所有的菜单等.它还可以创建一个新的build系统,自动补全,语言定义,代码片段,宏定义,快捷键 ...
- nodejs上传图片模块做法;
服务端代码: var express = require('express'); var swig = require('swig'); //1.引入multer模块 var multer = req ...
- HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)
题解见X姐的论文 矩阵乘法递推的优化.仅仅是mark一下. .
- angular的那些事
angular.js是什么 AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTM ...
- js中的数组和字符串的一些方法
数组的一些方法: 1.join()和split()方法 <script type="text/javascript">var x;var a=new Array();a ...