POJ 1236 Network of Schools(tarjan求强连通分量+思维)
题目链接:http://poj.org/problem?id=1236
题目大意:
给你一个网络(有向图),有两个任务:
①求出至少同时需要几份副本可以使得整个网络都获得副本
②至少添加多少信息表(有向边)使得副本传到任一点,都可以使得整个网络都获得副本
解题思路:
即给定一个有向图,求:
①至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点
②至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点
缩点后,分别求出出度入度为0的点数为sum1,sum2,
问题①的答案就为sum2;
问题②的答案为max(sum1,sum2)(即使得所有点的出度入度都大于0)。
注意,只有一个点时,不需要添加边,答案为1,0。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<vector>
using namespace std;
const int N=; int n,cnt,num; //cnt为当前dfs序,num为缩点编号
int low[N],dfn[N],fa[N],indeg[N],outdeg[N];//dfn为dfs序,low为节点能够通过返回的最早的祖先(注意这里跟求割边割点里的low不同)
vector<int>v[N]; //fa为节点所属的强联通分量的编号.indeg和outdeg为缩点的入度、出度
stack<int>sk; void init(){
cnt=num=;
for(int i=;i<=n;i++){
v[i].clear();
}
memset(fa,,sizeof(fa));
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
memset(indeg,,sizeof(indeg));
memset(outdeg,,sizeof(outdeg));
} //求强联通分量
void tarjan(int u){
low[u]=dfn[u]=++cnt;
sk.push(u);
for(int i=;i<v[u].size();i++){
int t=v[u][i];
if(!dfn[t]){ //未被访问
tarjan(t);
low[u]=min(low[u],low[t]);
}
else if(!fa[t]) low[u]=min(low[u],dfn[t]); //被访问过且在栈中
}
if(low[u]==dfn[u]){
num++;
while(!sk.empty()){
int t=sk.top();
sk.pop();
fa[t]=num;
if(t==u) break;
}
}
} int main(){
while(~scanf("%d",&n)){
init();
for(int i=;i<=n;i++){
int x;
while(~scanf("%d",&x)&&x) v[i].push_back(x);
}
for(int i=;i<=n;i++){ //遍历所有点
if(!dfn[i]) tarjan(i);
}
for(int i=;i<=n;i++){ //缩点,并求出相应的出度入度是否为0(注意不是求出入度)
for(int j=;j<v[i].size();j++){
int t=v[i][j];
if(fa[t]!=fa[i]){
outdeg[fa[i]]=;
indeg[fa[t]]=;
}
}
}
int sum1=,sum2=;
for(int i=;i<=num;i++){
if(outdeg[i]==)
sum1++;
if(indeg[i]==)
sum2++;
}
if(num==) //只有一个点时要特判
puts("1\n0");
else printf("%d\n%d\n",sum2,max(sum1,sum2));
}
return ;
}
POJ 1236 Network of Schools(tarjan求强连通分量+思维)的更多相关文章
- Poj 1236 Network of Schools (Tarjan)
题目链接: Poj 1236 Network of Schools 题目描述: 有n个学校,学校之间有一些单向的用来发射无线电的线路,当一个学校得到网络可以通过线路向其他学校传输网络,1:至少分配几个 ...
- POJ 1236 Network of Schools (Tarjan + 缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12240 Accepted: 48 ...
- POJ 1236 Network of Schools Tarjan缩点
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22729 Accepted: 89 ...
- poj 1236 Network of Schools : 求需要添加多少条边成为强连通图 tarjan O(E)
/** problem: http://poj.org/problem?id=1236 缩点后入度为0的点的总数为需要发放软件的学校个数 缩点后出度为0的点的总数和入度为0的点的总数的最大值为需要增加 ...
- 【POJ 1236 Network of Schools】强联通分量问题 Tarjan算法,缩点
题目链接:http://poj.org/problem?id=1236 题意:给定一个表示n所学校网络连通关系的有向图.现要通过网络分发软件,规则是:若顶点u,v存在通路,发给u,则v可以通过网络从u ...
- POJ 1236 Network of Schools(强连通 Tarjan+缩点)
POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意: 给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...
- POJ 1236 Network of Schools(强连通分量)
POJ 1236 Network of Schools 题目链接 题意:题意本质上就是,给定一个有向图,问两个问题 1.从哪几个顶点出发,能走全全部点 2.最少连几条边,使得图强连通 思路: #inc ...
- POJ 1236 Network of Schools (tarjan算法+缩点)
思路:使用tarjan求强连通分量并进行缩点,判断所有入度为0的点,这个点就是必须要给予文件的点,分别计算出度,入度为零的点的个数,取二者的最大值就是把这个图变成强连通需要加的边数. 一个取值需要讨论 ...
- kuangbin专题 专题九 连通图 POJ 1236 Network of Schools
题目链接:https://vjudge.net/problem/POJ-1236 题目:有向图,有若干个连通图,点之间有单向边边就可以单向传递信息,问: (1)至少需要发送几份信息才能使得每个点都传递 ...
随机推荐
- bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形
USACO划水中... 题目中要求经过原点的三角形数目,但这种三角形没什么明显的特点并不好求,所以可以求不经过原点的三角形数量. 对于一个非法三角形,它离原点最近的那条边连接的两个点所连的两条边一定在 ...
- 【贪心】【CF1061B】 Views Matter
Description 给定一个只有一行的,由 \(n\) 组小正方体组成的方块,每组是由 \(a_i\) 块小正方体竖直堆叠起来的,求最多能抽掉多少块使得它的左视图和俯视图不变.方块不会掉落 Inp ...
- 团体程序设计天梯赛 L1-010. 比较大小
测试数据: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 Code: 先确定最小,然后确定第二小 #include <stdio.h> #include < ...
- python代码自动补全配置及Django入门Demo
django入门代码示例小博客:https://pan.baidu.com/s/1pLjLPSv 1.自动补全功能 许多人都知道 iPython 有很好的自动补全能力,但是就未必知道 python 也 ...
- 01 C++ 多线程入门实例
1.可复用的完整实例 #include <iostream> #include <thread> #include <mutex> using namespace ...
- HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识
求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...
- SQL语句(十八_补充)——存储过程
一. 变量 1. 形式: @x (局部), @@x(全局) 2. 定义: declare @x 3. 赋值:Set @x = ? 4. 作用: 通用化 存储在服务器 5. 存储过程(预编译过的T-SQ ...
- 查看和修改linux系统时间
一.查看和修改Linux的时区1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区方法 A 命令 : "tzselect" 方法 ...
- vbs 解析 json jsonp 方法
昨天说了下用 htmlfile 来解析 html,今天依然用他来解析,htmlfile 是一个 COM 版的 BOM 和 DOM,所以解析 html, 执行 js 完全不在话下,今天就继续解析 jso ...
- MI-NOTE黑砖
机型:MI NOTE LTE miui7刷机老是报错,remote:partition table doesn't exist,分区表不存在,于是使用磁盘模式,也看到警告不要中途拔下来,但是不知道是 ...