给出一个 0 ≤ N ≤ 105 点数、0 ≤ M ≤ 105 边数的有向图,
输出一个尽可能小的点集,使得从这些点出发能够到达任意一点,如果有多个这样的集合,输出这些集合升序排序后字典序最小的。

输入描述:
第一行为两个整数 1 ≤ n, m ≤ 105
接下来 M 行,每行两个整数 1 ≤ u, v ≤ 105 表示从点 u 至点 v 有一条有向边。
数据保证没有重边、自环。

输出描述:
第一行输出一个整数 z,表示作为答案的点集的大小;
第二行输出 z 个整数,升序排序,表示作为答案的点集。
示例1
输入
7 10
4 5
5 1
2 5
6 5
7 2
4 2
1 2
5 3
3 5
3 6
输出
2
4 7

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int INF = 0x3f3f3f3f;
struct node
{int v, next;
}edge[maxn];
vector<int>p;
stack <int> s;
int dfn[maxn],low[maxn],color[maxn],in[maxn],tot,block,head[maxn],pre[maxn],n,m,cnt,C,X;
bool vis[maxn];
void add(int from, int to)
{edge[++cnt].v=to;edge[cnt].next=head[from];head[from]=cnt;
}
void tarjan(int u)
{dfn[u]=low[u]= ++tot;s.push(u);for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].v;if (!dfn[v]){tarjan(v);low[u]= min(low[u],low[v]);}else if(!color[v]) low[u]=min(low[u],dfn[v]);}if (dfn[u]==low[u]){block++;int v;do{v=s.top();s.pop();color[v]=block;pre[block]=min(v, pre[block]);//pre保存的是同强连通分量中编号最小点// vis[v]=0;}while (v!=u);}
}int main()
{cin>>n>>m;memset(head,-1,sizeof(head));memset(pre,INF,sizeof(pre));for(int i=0;i<m;i++){int u,v;scanf("%d%d",&u,&v);add(u,v);}for(int i=1;i<=n;i++)if(!dfn[i]) tarjan(i);if(block==1){cout <<"1"<< endl;return 0;}for(int i=1;i<=n;i++)for(int j=head[i];j!=-1;j=edge[j].next){int u=color[i];int v=color[edge[j].v];//判断u和v是不是在同一个强连通分量if(u!=v)in[v]++;//如果不是u指向v,v就记录入度}for(int i=1;i<=block;i++)//此处已经进行完压缩,压缩后还有block个点if(!in[i]) p.push_back(pre[i]); //如果一个点没有入度sort(p.begin(),p.end());cout<<p.size()<<endl;for(int i=0;i<p.size();i++) cout<<p[i]<< " ";cout<<endl;return 0;
}

可达性(tarjan算法)相关推荐

  1. tarjan算法不是很懂先mark一下。

     前面为转载的.后面是自己的理解. 三种tarjan算法(上) .这篇算是做一个总结吧. 求强连通分量 求无向图的割和桥 最近公共祖先 求强连通分量 基本概念:       强连通是有向图才有的概念. ...

  2. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  3. 0x66.图论 - Tarjan算法与无向图连通性

    目录 一.无向图的割点与桥 割点 桥/割边 时间戳 搜索树 追溯值 二.割边判定法则 三.割点判定法则 1.luogu P3388 [模板]割点(割顶) 2.luogu P3469 [POI2008] ...

  4. 对象是否要被回收(引用计数和可达性分析算法)

    java堆和方法区主要存放各种类型的对象(方法区中也存储一些静态变量和全局常量等信息),那么我们在使用GC对其进行回收的时候首先要考虑的就是如何判断一个对象是否应该被回收.也就是要判断一个对象是否还有 ...

  5. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  6. Tarjan算法学习笔记

    一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法. [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected ...

  7. 『追捕盗贼 Tarjan算法』

    追捕盗贼(COCI2007) Description 为了帮助警察抓住在逃的罪犯,你发明了一个新的计算机系统.警察控制的区域有N个城市,城市之间有E条双向边连接,城市编号为1到N. 警察经常想在罪犯从 ...

  8. 【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )

    文章目录 一.可达性分析算法 二.GC Root 示例 三.GC 回收前的两次标记 四.finalize 方法示例 一.可达性分析算法 在 堆内存 中 , 存在一个 根对象 GC Root , GC ...

  9. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

  10. CSP认证201509-4 高速公路[C++题解]:强连通分量、tarjan算法模板题

    题目分析 来源:acwing 分析: 所求即为强连通分量的个数,然后计算每个强连通分量中点的个数,相加即可. 所谓强连通分量,它是一个子图,其中任意两点可以相互到达,并且再加一个点,就不能满足任意两点 ...

最新文章

  1. shell 语法简介(转载)
  2. 2018 区块链技术及应用峰会(BTA)·中国全日程新鲜出炉,更多精彩议题看不停
  3. ssd2828测试进入测试模式_LOL卡牌推出“远征”轮抽模式 本周再度开启线上测试...
  4. 自然语言(NLP)发展史及相关体系
  5. Java遍历对象所有属性
  6. 80040e14 mysql_【ASP】提示错误80040e14
  7. JavaOne 2015 –提交的技巧和建议
  8. echart实例数据 本地加载_JVM 类加载概述
  9. “黑科技”监控图像技术你知道吗?
  10. mysql-索引操作
  11. 华为大佬:做一个快乐的程序员,而不是码农
  12. contenteditable获得焦点后的边框设置
  13. Centos单网卡多IP的配置
  14. 数据结构---最小生成树
  15. ibatis java 项目_iBatis搭建JAVA项目
  16. php视频自动播放源码,多个视频网站的视频自动播放代码
  17. 【软件工程】课程设计库存管理系统
  18. uni-app的checkbox多选和全选
  19. 开发问题1:在微服务项目中,如果一个服务工程不需要数据库但因为其父工程引入了数据库的依赖的话,会出现启动类启动动不了的问题
  20. [b2g] firefoxOS 移植记录

热门文章

  1. 计算机网络CDMA工作原理分析与例证说明
  2. @Pointcut 使用@annotation 带参数
  3. 网站服务以及部署网站论坛discuz与网络论坛WordPress
  4. 修复登录接口社区论坛微信小程序源码下载-支持多种发帖模式超强社区
  5. PSO算法(优化与探索四*DDPG与GAN)
  6. Linux Kafka安装与启动
  7. Rock pi E 初始化 + 安装 tensorflow
  8. CentOS 8 中安装配置FreeRADIUSDaloRADIUS以及为不同SSID验证MAC等
  9. Java简介超详细整理,适合新手入门
  10. 查询局域网内所有IP