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

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
 
题意很清楚,就是判断有向图是否是强连通图,即图中任意两点是不是可以相互可达;
新学的tarjan算法,理解的还不是很透彻,参考着伪代码和大神的代码敲得;
 #include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std; vector<int>edge[];//用邻接表存图;
int n,m;
int dfn[];//深度优先搜索访问次序,记录u第一次被访问的步数;
int low[];//能追溯到的最早的次序;
int st[];//tarjan中的栈;
int din; //索引号;
int num; //强连通分量个数;
int top; //栈中元素个数;
int in[];//是否在栈中; void tarjan(int u)
{
int i,j;
int v;
dfn[u] = low[u] = ++din;//为节点u设定访问序号;
in[u] = ;
st[++top] = u;//压入栈中
for(i = ; i < edge[u].size(); i++)//遍历与u相连的节点
{
v = edge[u][i];
if(!dfn[v])//如果节点v未被访问过
{
tarjan(v);//继续向下访问
low[u] = min(low[u],low[v]);
}
else if(in[v])//如果节点v已被访问过,并且已在栈中
{
low[u] = min(low[u],dfn[v]);
}
} if(dfn[u] == low[u])//如果节点u是强连通分量的根
{
num++;//连通分量数加1;
do
{
j = st[top--];
in[j] = ;
}
while(j != u);//将该强连通分量中的节点退栈,
} }
void init()
{
int i;
memset(dfn,,sizeof(dfn));
top = ;
num = ;
din = ;
for(i = ; i <= n; i++)
{
if(!dfn[i])
{
tarjan(i);
}
} }
int main()
{
int u,v;
while(~scanf("%d %d",&n,&m))
{
if(n == && m == )
break;
for(int i = ; i <= n; i++)
edge[i].clear();
while(m--)
{
scanf("%d %d",&u,&v);
edge[u].push_back(v);
}
init();
if(num == )
printf("Yes\n");
else printf("No\n");
}
return ;
}

实例代码

?

tarjan(u)

{
DFN[u]=Low[u]=++Index //为节点u设定次序编号和Low初值
Stack.push(u) // 将节点u压入栈中
foreach (u, v)in E // 枚举每一条边
if(v is not visted) // 如果节点v未被访问过
tarjan(v) //继续向下找
Low[u]= min(Low[u], Low[v])
elseif(v in S) //如果节点v还在栈内
Low[u]= min(Low[u], DFN[v])
if(DFN[u]== Low[u]) //如果节点u是强连通分量的根
repeat
v = S.pop // 将v退栈,为该强连通分量中一个顶点
print v
until (u== v)
}

HDOJ迷宫城堡(判断强连通 tarjan算法)的更多相关文章

  1. hdu1269迷宫城堡(判断有向图是否是一个强连通图)

    1 /* 题意: 给你一个图,求这个有向图示否是一个强连通图(每两个节点都是可以相互到达的)! 思路1:按正向边dfs一遍,将经过的节点计数,如果记录的节点的个数小于n,那么就说明图按照正向边就不是连 ...

  2. HDU 1269 迷宫城堡 (强连通分量,常规)

    题意: 判断所给的有向图是否是一个强连通图. 思路: 如果连通分量大于1则必定No,如果强连通分量大于1也是No.tarjan算法求强连通分量. #include <cstdio> #in ...

  3. 【算法•日更•第二十八期】图论:强连通+Tarjan算法(一)

    ▎前言 一直都想学习这个东西,以为很难,结果发现也不过如此. 只要会些图论的基础就可以了. ▎强连通 ☞『定义』 既然叫强连通,那么一定具有很强的连通性. 强连通:就是指在一个有向图中,两个顶点可以互 ...

  4. HDU 1269 迷宫城堡(强连通)

    HDU 1269 迷宫城堡 pid=1269" target="_blank" style="">题目链接 题意:中文题 思路:强连通模板题 代 ...

  5. CF:Problem 427C - Checkposts强连通 Tarjan算法

    tarjan算法第一题 喷我一脸. ...把手写栈的类型开成了BOOL.一直在找错.. . #include<cstdio> #include<cstring> #includ ...

  6. HDU 1269:迷宫城堡(强连通)

    http://acm.hdu.edu.cn/showproblem.php?pid=1269 题意:确定是否是一个强连通图. 思路:裸的tarjan算法. #include <cstdio> ...

  7. HDU 1269 迷宫城堡(判断有向图强连通分量的个数,tarjan算法)

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

  8. HDU 1269 迷宫城堡 tarjan算法求强连通分量

    基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等, ...

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

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

随机推荐

  1. iOS-设置状态栏白色以及覆盖状态栏

    iOS-设置状态栏白色以及覆盖状态栏 将状态栏设置为白色 首先, 在info.plist中添加一个标记. View controller–based status bar appearance键值设置 ...

  2. [转] 函数编程之闭包漫谈(Closure)

    在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义 先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境).这个从字面上很难理解,特别对于一 ...

  3. Python 记录(一)

    一开始没发现3.5与2.x版本的区别,导致浪费了很多时间在导包等问题上: 如: Pyhton2中的urllib2工具包,在Python3中分拆成了urllib.request和urllib.error ...

  4. 运行yum报错:Error: Cannot retrieve metalink for repository: epel. Please verify its path

    Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again 当我们安装第三方扩 ...

  5. jQuery失去焦点的时候注册验证

    //注册验证$('form :input').blur(function () { if ($("#txtName").val() == "") { $(&qu ...

  6. Java 最简单的批处理

    批处理Batch && PreparedStatement : import java.sql.*; public class TestBatch { public static vo ...

  7. LTP 分词算法实践

    参考链接: https://github.com/HIT-SCIR/ltp/blob/master/doc/install.rst http://www.xfyun.cn/index.php/serv ...

  8. SQL server抽疯后修改sa密码无法成功的处理办法

    今天上班打开电脑,发现尼玛所有项目启动后都报错,原因是说数据库sa的验证错误,无法进行数据库链接等等东西,简单地说---SQL server抽疯了!!!:( 昨天还好好的.而且没有修改过东西.为啥会出 ...

  9. postgresql jsonb类型查询

    select * from (select * from ud_order where user_id=10 and status=2unionselect * from ud_order where ...

  10. SQL 优化,全

    性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句,要设 ...