poj1236 Network of Schools ,有向图求强连通分量(Tarjan算法),缩点
题目链接: 点击打开链接
题意:
给定一个有向图,求:
1) 至少要选几个顶点。才干做到从这些顶点出发,能够到达所有顶点
2) 至少要加多少条边。才干使得从不论什么一个顶点出发,都能到达所有顶点
顶点数<= 100
求完强连通分量后,缩点,计算每一个点的入度,出度。
第一问的答案就是入度为零的点的个数,
第二问就是max(n,m) // 入度为零的个数为n, 出度为零的个数为m. //kuangbin巨巨分析非常棒!
#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm> using namespace std; const int maxn = 100 + 10; vector<int> G[maxn];
int dfn[maxn], low[maxn], belong[maxn], dfs_clock, scc_cnt;
stack<int> S; void dfs(int u){
dfn[u] = low[u] = ++dfs_clock;
S.push(u);
for(int i=0; i<G[u].size(); ++i){
int v = G[u][i];
if(!dfn[v]){
dfs(v);
low[u] = min(low[u], low[v]);
}else if(!belong[v]){
low[u] = min(low[u], dfn[v]);
}
}
if(low[u] == dfn[u]){
scc_cnt++;
for(;;){
int x = S.top(); S.pop();
belong[x] = scc_cnt;
if(x == u) break;
}
}
} void find_scc(int n){
dfs_clock = scc_cnt = 0;
memset(belong, 0, sizeof belong );
memset(dfn, 0, sizeof dfn );
for(int i=0; i<n; ++i)
if(!dfn[i]) dfs(i);
} int main()
{
int n, i, j, x;
scanf("%d", &n);
for(i=0; i<n; ++i)
{
while(scanf("%d",&x),x)
{
x--;
G[i].push_back(x);
}
} find_scc(n);
if(scc_cnt==1){
printf("1\n0\n");
return 0;
}
//缩点后,统计每一个点的出度和入度
int in[maxn], out[maxn];
memset(in, 0, sizeof in );
memset(out, 0, sizeof out );
for(i=0; i<n; ++i)
for(j=0; j<G[i].size(); ++j)
{
int v = G[i][j] ;
if(belong[i] != belong[v])
{
out[ belong[i] ]++;
in[ belong[v] ]++;
}
} int in_tot = 0, out_tot = 0;
for(i=1; i<=scc_cnt; ++i)
{
if(!in[i]) in_tot++;
if(!out[i]) out_tot++;
} printf("%d\n%d\n", in_tot,max(in_tot,out_tot));
return 0;
} /*
by kuangbin 强连通分量缩点求入度为0的个数和出度为0的分量个数
题目大意:N(2<N<100)各学校之间有单向的网络。
每一个学校得到一套软件后。能够通过单向网络向周边的学校传输,
问题1:初始至少须要向多少个学校发放软件,使得网络内全部的学校终于都能得到软件。
2,至少须要加入几条传输线路(边)。使随意向一个学校发放软件后。
经过若干次传送。网络内全部的学校终于都能得到软件。 也就是:
给定一个有向图,求:
1) 至少要选几个顶点,才干做到从这些顶点出发。能够到达全部顶点
2) 至少要加多少条边,才干使得从不论什么一个顶点出发。都能到达全部顶点
顶点数<= 100
解题思路:
1. 求出全部强连通分量
2. 每一个强连通分量缩成一点,则形成一个有向无环图DAG。 3. DAG上面有多少个入度为0的顶点。问题1的答案就是多少
在DAG上要加几条边。才干使得DAG变成强连通的,问题2的答案就是多少
加边的方法:
要为每一个入度为0的点加入入边,为每一个出度为0的点加入出边
假定有 n 个入度为0的点,m个出度为0的点,怎样加边?
把全部入度为0的点编号 0,1,2,3,4 ....N -1
每次为一个编号为i的入度0点可达的出度0点,加入一条出边,连到编号为(i+1)%N 的那个出度0点,
这须要加n条边
若 m <= n,则
加了这n条边后,已经没有入度0点。则问题解决,一共加了n条边
若 m > n。则还有m-n个入度0点,则从这些点以外任取一点,和这些点都连上边,就可以,这还需加m-n条边。
所以,max(m,n)就是第二个问题的解
此外:当仅仅有一个强连通分支的时候,就是缩点后仅仅有一个点,尽管入度出度为0的都有一个,可是实际上不须要添加清单的项了,所以答案是1。0;
*/ /*
input:
30
18 0
7 21 0
1 4 15 28 0
9 0
10 15 16 0
22 26 0
1 5 10 12 0
3 17 29 0
2 5 17 0
19 23 0
20 0
1 7 15 19 0
0
23 0
0
0
5 18 0
0
7 18 0
17 0
24 0
13 21 0
26 0
0
2 23 30 0
2 9 11 13 14 27 0
2 0
14 0
0
28 0 output:
3
6
*/
poj1236 Network of Schools ,有向图求强连通分量(Tarjan算法),缩点的更多相关文章
- 【有向图】强连通分量-Tarjan算法
好久没写博客了(都怪作业太多,绝对不是我玩的太嗨了) 所以今天要写的是一个高大上的东西:强连通 首先,是一些强连通相关的定义 //来自度娘 1.强连通图(Strongly Connected Grap ...
- [有向图的强连通分量][Tarjan算法]
https://www.byvoid.com/blog/scc-tarjan 主要思想 Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树.搜索时,把当前搜索树中未处理的 ...
- 求强连通分量Tarjan算法
]; // 时间戳 ; // 时间 ]; // 节点u所能访问到的最小时间戳 ]; // 节点u是否在栈中. ]; ; // 我们维护的信息. ]; // 给节点染色, 同一个连通块的节点应该是同一个 ...
- 有向图强连通分量 Tarjan算法
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- 有向图强连通分量Tarjan算法
在https://www.byvoid.com/zhs/blog/scc-tarjan中关于Tarjan算法的描述非常好,转述如下: 首先解释几个概念: 有向图强连通分量:在有向图G中,如果两个顶点间 ...
- 图之强连通、强连通图、强连通分量 Tarjan算法
原文地址:https://blog.csdn.net/qq_16234613/article/details/77431043 一.解释 在有向图G中,如果两个顶点间至少存在一条互相可达路径,称两个顶 ...
- POJ1236_A - Network of Schools _强连通分量::Tarjan算法
Time Limit: 1000MS Memory Limit: 10000K Description A number of schools are connected to a compute ...
- POJ-1236 Network of Schools,人生第一道Tarjan....
Network of Schools 题意:若干个学校组成一个计算机网络系统,一个学校作为出发端连接着若干个学校,信息可以传送到这些学校.被链接的学校不需要再次与出发端相连,现在问你:A:最少选几个学 ...
- 图的连通性:有向图强连通分量-Tarjan算法
参考资料:http://blog.csdn.net/lezg_bkbj/article/details/11538359 上面的资料,把强连通讲的很好很清楚,值得学习. 在一个有向图G中,若两顶点间至 ...
随机推荐
- win2008服务器信任问题
右键计算机,管理,在第一个页面里面有个安全信息,里面的右边有一个配置IE ESC ,点击他后会出现一个窗口,在那里面选择禁用即可!
- week01-绪论报告
一.作业题目: 仿照三元组或复数的抽象数据类型写出有理数抽象数据类型的描述 (有理数是其分子.分母均为整数且分母不为零的分数). 有理数基本运算: 构造有理数T,元素e1,e2分别被赋以分子.分母值 ...
- 行为型设计模式之职责链模式(Chain of Responsibility)
结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个 ...
- SQL联合查询(内联、左联、右联、全联)语法
SQL联合查询(内联.左联.右联.全联)语法 概述: 联合查询效率较高,举例子来说明联合查询:内联inner join .左联left outer join .右联right outer join ...
- 渗透协作工具 dradis centos安装
https://dradisframework.com/ce/documentation/install_centos.html yum install rubygems 安装的bundle在drad ...
- app:compileDebugNdk,NDK
Error:Execution failed for task ':app:compileDebugNdk'. > Error: Your project contains C++ files ...
- Flex与51单片机socket通信 策略问题
直接把<cross-domain-policy> <allow-access-from domain="*" to-ports="*"/> ...
- 使用log4j2分离系统日志与业务日志
前一篇文章介绍了log4j2 扩展日志级别,支持将系统日志与业务处理日志拆分,现在介绍一下通过日志级别将系统日志与业务日志分类,要达到这个目的很容易,只需要配置一下log4j的xml文件: <? ...
- windows 2012(64位) IIS配置asp程序 500 - 内部服务器错误。您查找的资源存在问题,因而无法显示。
在网上找了很久,包括常规的设置父路径之类的,一直都不可以,搞了一晚上毫无成就感,第二天早上无意中看到一篇文章,说到点子上了,非常感谢.源地址已经找不到了,我把大概的问题截图说明一下. 方法如下:1.打 ...
- HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)
题目链接 2017 CCPC Harbin Problem K 题意 给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...