迷宫城堡

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10409    Accepted Submission(s): 4674

Problem Description

了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单
向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请
你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间
i。
 
Input
输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。
 
Output
对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。
 
Sample Input
3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
 
Sample Output
Yes No
题解:
强联通问题,targin算法,或者dfs做,建图也可以用邻接表,或者vector;
方法一dfs:
 #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)的更多相关文章

  1. 【强联通图 | 强联通分量】HDU 1269 迷宫城堡 【Kosaraju或Tarjan算法】

      为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明 ...

  2. HDU 1269 迷宫城堡 【强联通分量(模版题)】

    知识讲解: 在代码里我们是围绕 low 和 dfn 来进行DFS,所以我们务必明白 low 和 dfn 是干什么的? 有什么用,这样才能掌握他.   1.  dfn[]  遍历到这个点的时间 2.   ...

  3. hdu 1269 迷宫城堡(Targin算法)

    ---恢复内容开始--- 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. hdu 1269 迷宫城堡 最简单的联通图题 kosaraju缩点算法

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Des ...

  5. hdu 1269 迷宫城堡

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个 ...

  6. 有向图的强联通tarjan算法(判断是否为强联通模板)(hdu1269)

    hdu1269 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  7. 迷宫城堡+算法讲解【tarjian算法】

    Tarjan 算法 参考博客:https://www.cnblogs.com/shadowland/p/5872257.html 算法讲解 Tarjan 算法一种由Robert Tarjan提出的求解 ...

  8. 迷宫城堡--HDOJ 1269

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. hdoj 1269 迷宫城堡【scc基础题目】

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

随机推荐

  1. JS一些小算术、1加到50、乘法口诀表、买鸡等

    //从1加到50 for (var a=1,i=0;a<51; a++) {i=a+i} document.write(i);//1加到50 var num=0; for(var i=1;i&l ...

  2. CDC不同模式在ODI中体现系列之一 同步模式

    CDC不同模式在ODI中体现系列之一 同步模式 Oracle Database Change Data Capture feature 变化数据捕获是一个通称,是用来描述捕捉增量变化应用到数据存储.随 ...

  3. 九度OnlineJudge之1021:统计字符

    题目描述:     统计一个给定字符串中指定的字符出现的次数. 输入:     测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过5的字符串,第2行为一个长度不超过80的字符串.注 ...

  4. [Leetcode][Python]30: Substring with Concatenation of All Words

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 30: Substring with Concatenation of All ...

  5. 关于hasOwnProperty()方法的应用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 将外部准备好的sqlite导入到项目当中

    首先,将sqlite数据库文件放在Resource文件夹下,并且允许其编译到项目当中. 之后在AppDelegate当中执行一些代码,这里将代码封装了一个Helper: #import "R ...

  7. Matrix Swapping II(求矩阵最大面积,dp)

    Matrix Swapping II Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  8. iOS 8.0正式公布啦

    从昨晚開始,苹果新版移动操作系统iOS 8.0開始提供免费下载服务.新版操作系统提供有数百个新功能,当中包含相机功能中添加了延时摄影模式,能够使用其它厂商开发的输入法.购买的App应用程序能够与最多6 ...

  9. 【Android进阶学习】shape和selector的结合使用

    shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector.可以这样说,shape和 ...

  10. Codeforces Round #262 (Div. 2) B

    题目: B. Little Dima and Equation time limit per test 1 second memory limit per test 256 megabytes inp ...