Tarjin + 缩点
链接:https://www.nowcoder.com/acm/contest/81/C
来源:牛客网
题目描述
输出一个尽可能小的点集,使得从这些点出发能够到达任意一点,如果有多个这样的集合,输出这些集合升序排序后字典序最小的。
输入描述:
第一行为两个整数 1 ≤ n, m ≤ 10
5
,
接下来 M 行,每行两个整数 1 ≤ u, v ≤ 10
5
表示从点 u 至点 v 有一条有向边。
数据保证没有重边、自环。
输出描述:
第一行输出一个整数 z,表示作为答案的点集的大小;
第二行输出 z 个整数,升序排序,表示作为答案的点集。
输入
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 题意 : 寻找最小的点集,使得从这些点出发的可以遍历整张图
思路分析 : Trajin + 缩点
代码示例 :
const int maxn = 1e5+10; vector<int>ve[maxn];
vector<int>id[maxn]; // 强连通的编号
int n, m;
int dfn[maxn], low[maxn]; // 每个点在这棵树中,最小的子树的根
int tot = 0, key = 0;
int Stack[maxn], belong[maxn]; // 缩点
bool instack[maxn];
int scc; // 强连通分量的个数 void tarjin(int x){
low[x] = dfn[x] = ++key; // 注意是 ++在前,因为下面下面深搜的判断是为0表示没访问过的点,才去搜
Stack[tot++] = x;
instack[x] = true; for(int i = 0; i < ve[x].size(); i++){
int to = ve[x][i]; if (!dfn[to]) {
tarjin(to);
low[x] = min(low[x], low[to]);
}
else if (instack[to]){
low[x] = min(low[x], dfn[to]);
}
}
if (low[x] == dfn[x]){
scc++;
int v;
do{
v = Stack[--tot];
instack[v] = false;
belong[v] = scc;
id[scc].push_back(v);
}
while(v != x);
}
}
int u[maxn], v[maxn], in[maxn];
vector<int>ans; void solve(){ } int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin >> n >> m;
int a, b; memset(dfn, 0, sizeof(dfn));
memset(low, 0, sizeof(low));
memset(instack, false, sizeof(instack));
memset(in, 0, sizeof(in));
for(int i = 1; i <= m; i++){
scanf("%d%d", &u[i], &v[i]);
ve[u[i]].push_back(v[i]);
}
for(int i = 1; i <= n; i++){
if (!dfn[i]) tarjin(i);
} //for(int i = 1; i <= n; i++) printf("%d ", belong[i]);
for(int i = 1; i <= m; i++){
if (belong[u[i]] == belong[v[i]]) continue;
in[belong[v[i]]]++;
}
for(int i = 1; i <= scc; i++) sort(id[i].begin(), id[i].end());
for(int i = 1; i <= scc; i++){
if (!in[i]) {
ans.push_back(id[i][0]);
}
}
sort(ans.begin(), ans.end());
printf("%d\n", ans.size());
for(int i = 0; i < ans.size(); i++){
printf("%d%c", ans[i], i==ans.size()-1?'\n':' ');
}
return 0;
}
Tarjin + 缩点的更多相关文章
- Warm up-HUD4612(树的直径+Tarjin缩点)
http://acm.hdu.edu.cn/showproblem.php?pid=4612 题目大意:求加一条边最小的桥数 先用Tarjin缩点求出一棵树,然后用bfs求出树的直径,树的直径就是加一 ...
- poj 2186 强连通入门题目
每头牛的梦想就是成为牛群中最受欢迎的牛. 在一群N(1 <= N <= 10,000)母牛中, 你可以得到M(1 <= M <= 50,000)有序的形式对(A,B),告诉你母 ...
- 洛谷 P3420 [POI2005]SKA-Piggy Banks
P3420 [POI2005]SKA-Piggy Banks 题目描述 Byteazar the Dragon has NN piggy banks. Each piggy bank can eith ...
- 国庆 day 7 下午
思路:见博客. #include<iostream> #include<cstdio> #include<cstring> #include<algorith ...
- hdu 4674 Trip Advisor(缩点+倍增lca)
花了一天半的时间,才把这道题ac= = 确实是道好题,好久没敲这么长的code了,尤其是最后的判定,各种销魂啊~ 题目中给出的条件最值得关注的就是:每个点最多只能在一个环内->原图是由一个个边连 ...
- HDU 5934 Bomb 【图论缩点】(2016年中国大学生程序设计竞赛(杭州))
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- POJ 2186 Popular Cows(Targin缩点)
传送门 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31808 Accepted: 1292 ...
- poj2186--tarjan+缩点
题目大意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也 ...
- POJ3160 Father Christmas flymouse[强连通分量 缩点 DP]
Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 3241 Accep ...
随机推荐
- Vue 父组件往子组件传递方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java虚拟机参数,增加虚拟机最大内存,在/etc/profile增加如下: export JAVA_OPTS="-Xms9g -Xmx9g"
一.运行class文件 执行带main方法的class文件,Java虚拟机命令参数行为: java <CLASS文件名> 注意:CLASS文件名不要带文件后缀.class 例如: java ...
- DataBinding + Kotlin +Viewpager
1.创建viewmodel,其中BindAdapter的方法需要是静态方法,因此需要加@JvmStatic,"app:img"相当于一个自定义属性,后面xml中会用到,当app:i ...
- lumen 笔记一
可以用config()函数和evn()函数来获取 .evn里面的配置内容 config('app.timezone') 获取配置config(['app.timezone' => 'China/ ...
- SSI(服务器端嵌入)
简介 SSI(服务器端嵌入)是一组放在 HTML 页面中的指令,当服务器向客户端访问提供这些页面时,会解释执行这些指令.它们能为已有的 HTML 页面添加动态生成内容,不需要通过 CGI 程序来或其他 ...
- F4与F1对比
- js实现php函数urlencode
原文链接:https://www.cnblogs.com/xiaochaohuashengmi/archive/2010/05/28/1746168.html 本文介绍了php函数urlencode的 ...
- 小白学 Python 爬虫(30):代理基础
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- macaca安装(mac)
macaca 安装 安装Homebrew/Node/npm/cnpm/carthage 这些工具的安装参见 appium 环境搭建 安装相关工具 $ brew install usbmuxd $ br ...
- saltstack的配置配置
一.为不同的环境设置不同的文件目录 1.1 修改配置文件 /etc/salt/master [root@node1 salt]# vim /etc/salt/master file_roots: ba ...