迷宫城堡(强联通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 ...
随机推荐
- loading 动画效果(收藏起来以后留着慢慢用)
动画效果一: html代码: <div class="spinner"> <div class="rect1"></div&g ...
- 记一次C++与lua连接
今晚,花了两个多钟折腾lua和c++的互连,终于成功了,觉得有必要记录下来.说实话,搜索引擎真是有利有弊,利在你有地方搜答案,弊则在于你半天都找不到正确的答案甚至找到误导你的答案,今晚更加加深了我的体 ...
- hdu 4059 The Boss on Mars 容斥
题目链接 求出ai^4+a2^4+......an^4的值, ai为小于n并与n互质的数. 用容斥做, 先求出1^4+2^4+n^4的和的通项公式, 显然是一个5次方程, 然后6个方程6个未知数, 我 ...
- Kill 正在执行的存储过程
1.找到正在执行的存储过程的 sid ,serial# select b.sid,b.SERIAL#,a.OBJECT, 'alter system kill session ' || ''' ...
- J2SE知识点摘记(二十六)
为了用“集合框架”的额外部分把排序支持添加到 Java 2 SDK,版本 1.2,核心 Java 库作了许多更改.像 String 和 Integer 类如今实现 Comparable 接口以提供自然 ...
- U盘安装XP SP3 professional手记
因为专业应用的软件无法在win7上运行,但在XP上是可以正常使用,所以有想法并有必要重装一下. 说句实在话,之前用U盘安装Windows7真的没有这么麻烦,没想到相同的技术用于安装XP 却是如此折腾人 ...
- oracle中文支持
- Day01
1.@Test函数,执行后控制台没有输出结果? 1) 不能用静态方法,控制台会没有结果. 2) 不能把类名命名为Test,@Test不识别. 2.遍历Map集合的entrySet方法不会? 3.使 ...
- Java-----Excel转HTML
尽管是转别人的(忘了哪转过来的了),但此处标为原创不是为了提高訪问量,也不是为了其它.仅仅是纯粹的认为有实际用途.希望能给很多其它有此需求的人看到并能帮到他们就足够了 所需jar包:jxl.jar p ...
- Python文件或目录操作的常用函数
◆ os.listdir(path) Return a list containing the names of the entries in the directory given by path. ...