传送门HDU1269

描述

为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。

输入

输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。

输出

对于输入的每组数据,如果任意两个房间都是相互连接的,输出”Yes”,否则输出”No”。

样例

  • Input
    3 3
    1 2
    2 3
    3 1
    3 3
    1 2
    2 3
    3 2
    0 0
  • Output
    Yes
    No

题解

  • 判断所给有向图是否强联通
  • Tarjan可以找出所有强联通分量并进行分类。
  • 此算法通过dfs实现:

    • 用dfn[i]来表示i节点第一次被搜索到的时间戳
    • 用low[i]表示i点和i的子孙节点能追溯到的dfn的最小值
    • 用栈sta来存放当前 可能 构成强联通分量的点
    • 用vis[i]来记录点i当前是否在栈sta中
  • 通过链式前向星遍历节点
    • 初始化dfn[i]=low[i]=被dfs到的次序
    • 将点i存入sta中,vis[i]=true
      • 如果i在sta中,且后面遍历到的某点j能够到达i的话,那么i~j属于同一个联通分量
    • 遍历i能到的每一个点j,如果dfn[j]=0,即未被访问过,则对j进行dfs,然后low[i]=min(low[i],low[j])
    • 如果j能到达的下一个点i已经在sta中,则说明i~j属于同一个联通分量,那么low[j]=min(low[j],dfn[i]),在回溯的过程中,low[i~j]都会变成min(low[j]),这样就能找到强联通分量的根
    • 如果dfn[i]==low[i],则说明i和他的子孙节点可构成一个联通分量,其子孙节点存放于sta中,将这些节点弹出并进行染色标记
  • 最后,同一个染色标记的所有节点为同一个强联通分量,可将他们看作一个点,即缩点操作,这些强联通分量间构成一个有向无环图。
  • 时间复杂度O(n+m)

Code

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
#include<bits/stdc++.h>#define INIT(a,b) memset(a,b,sizeof(a))#define LL long longusing namespace std;const int inf=0x3f3f3f3f;const int maxn=1e4+7;const int maxm=1e5+7;const int mod=1e9+7;struct Edge{    int from,to,next;}edge[maxm];int Begin[maxn],dfn[maxn],low[maxn],vis[maxn],sta[maxn],color[maxn];int n,m,tot,top,dfsNum,colNum;

void init(){    INIT(Begin,-1);INIT(vis,0);    INIT(low,0);INIT(dfn,0);    INIT(color,0);    top=-1,tot=0,dfsNum=0,colNum=0;}void add(int x,int y){    edge[tot]=(Edge){x,y,Begin[x]};    Begin[x]=tot++;}void Tarjan(int x){    dfn[x]=low[x]=++dfsNum; //标记时间戳    vis[x]=1;    sta[++top]=x; //入栈    for(int i=Begin[x];~i;i=edge[i].next){        int ne=edge[i].to;        if(!dfn[ne]){            Tarjan(ne);            low[x]=min(low[x],low[ne]);        }        else if(vis[ne]) low[x]=min(low[x],dfn[ne]); //找到环    }    if(low[x]==dfn[x]){        vis[x]=0;        color[x]=++colNum;        //出栈并染色        while(sta[top]!=x){            vis[sta[top]]=0;            color[sta[top--]]=colNum;        }        top--;//弹出x    }}int main(){    int x,y;    while(~scanf("%d%d",&n,&m)&&(n||m)){        init();        while(m--){            scanf("%d%d",&x,&y);            add(x,y);        }        for(int i=1;i<=n;i++)            if(!dfn[i]) Tarjan(i);        if(colNum==1) printf("Yes\n");        else printf("No\n");

    }    return 0;}

迷宫城堡——Tarjan相关推荐

  1. 【HDU 1269】迷宫城堡 (Tarjan算法)

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

  2. 【HDU - 1269】迷宫城堡 (tarjan算法模板)

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

  3. HDU1269 迷宫城堡(模板题)

    HDU1269 迷宫城堡 文章目录 Problem Description 题解: Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N< ...

  4. HDU 1269 迷宫城堡(强连通图的判定)

    最近<算法导论>快看完图论部分了,很多有关图的算法都彻底搞懂并加以证明了.现在主要是将理解的思想用到题目中来加强下.这个题目主要是判断一下整个图是否是强连通的,很简单,可以用tarjan也 ...

  5. HDOJ1269(迷宫城堡)

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

  6. HDU 1269 迷宫城堡 -- 强连通图判断

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1269 图的强连通分量 http://baike.baidu.com/link?url=NqsmNsGC ...

  7. Hdu 1269.迷宫城堡

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

  8. 迷宫城堡(HDU-1269)

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

  9. Java实现迷宫城堡(强连通图的判定)

    1 问题描述 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单 ...

最新文章

  1. ​阿里达摩院金榕:从技术到科学,中国 AI 将何去何从?
  2. [转载]签名、加密、证书的基本原理和理解
  3. Redis实现求交集操作结果缓存的设计方案
  4. javascript   漂亮随机码
  5. 使用vmstat和iostat命令进行Linux性能监控
  6. JavaScript学习总结(9)——JS常用函数(一)
  7. CIKM'21「eBay」推荐系统--利用超图对商品的多模态信息建模
  8. 我一个月2000多元钱退休工资,可以完成自驾游全国的心愿吗?
  9. 专访1药网董事长于刚:若没刘峻岭 就没我后面创业的精彩
  10. 利用正则表达式 替换字符串中多个 URL
  11. bos 获取数据库连接_bos数据库表
  12. windows7/windows server 2008 r2升级至sp1
  13. 80C51单片机的四组IO口
  14. asp毕业设计——基于asp+sqlserver的英语网络考试系统设计与实现(毕业论文+程序源码)——网络考试系统
  15. 八哥英语词根词缀汇总
  16. VUE不同路由地址跳转相同页面,页面数据根据不同参数刷新
  17. 面向对象三大基本特性
  18. [转]浅谈缓冲区溢出之栈溢出
  19. 华为DHCP Snooping原理及其实验配置
  20. 《赢在中国蓝天碧水间》观后感

热门文章

  1. 暗影精灵2pro重装ubuntu16.04,实现ubuntu16.04和win10双系统并存。
  2. CASIO fx-991es Plus科学计算器使用技巧
  3. 淘宝联盟:该网站还有非联盟创建的广告位,请先删除广告位
  4. sleep和wait的区别
  5. 通达信指标公式颜色代码的四种写法(COLOR/RGB)
  6. 品牌统一化vs多元化:美团与滴滴为何选择了不同道路?
  7. 温暖相伴 | “健康未来”项目携手九三学社走进玉林市乡村小学
  8. 2013豆瓣校园招聘研发类笔试题-B卷
  9. Socket入门详解
  10. python多线程爬取某网站全部h漫画_Python多线程爬虫爬取网页图片