洛谷 P2746 [USACO5.3]校园网Network of Schools schlnet Tarjan强连通分量
schlnet
★★★ 输入文件:schlnet.in 输出文件:schlnet.out 简单对比
时间限制:1 s 内存限制:128 MB
描述
一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意如果 B 在 A 学校的分发列表中,那么 A 不必也在 B 学校的列表中。
你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务 A)。更进一步,我们想要确定通过给任意一个学校发送新软件,这个软件就会分发到网络中的所有学校。为了完成这个任务,我们可能必须扩展接收学校列表,使其加入新成员。计算最少需要增加几个扩展,使得不论我们给哪个学校发送新软件,它都会到达其余所有的学校(子任务 B)。一个扩展就是在一个学校的接收学校列表中引入一个新成员。
INPUT FORMAT (file schlnet.in)
输入文件的第一行包括一个整数 N:网络中的学校数目(2 <= N <= 100)。学校用前 N 个正整数标识。接下来 N 行中每行都表示一个接收学校列表(分发列表)。第 i+1 行包括学校 i 的接收学校的标识符。每个列表用 0 结束。空列表只用一个 0 表示。
OUTPUT FORMAT(file schlnet.out)
你的程序应该在输出文件中输出两行。第一行应该包括一个正整数:子任务 A 的解。第二行应该包括子任务 B 的解。
SAMPLE INPUT (file schlnet.in)
5
2 4 3 0
4 5 0
0
0
1 0
SAMPLE OUTPUT (file schlnet.out)
1
2
QAQ模拟赛考的有一点废 来总结一下题解吧
这一道题很显然是一个Tarjan (虽然我会写Tarjan 但是我不会这一道题该怎么处理QAQ)
这一道题的正解是这样子的
就是先用Tarjan来进行缩点
然后第一个问题
为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务 A) 就是找整个缩完点后的图中 有几个入度为0的点(嗷嗷嗷 我当时怎么就没有想到啊~~)
第二个问题
计算最少需要增加几个扩展,使得不论我们给哪个学校发送新软件,它都会到达其余所有的学校(子任务 B)
一个扩展就是在一个学校的接收学校列表中引入一个新成员。
就是再加上几条边
这一道题的正解居然是 max(入度为0的点的个数 , 出度为0的点的个数)
(本人正在奋力写代码中)
#include<bits/stdc++.h>
#define maxn 105
using namespace std;
vector<int> v[maxn];
int dfn[maxn],low[maxn],st[maxn],belong[maxn],tim,scc_cnt,cnt,size[maxn];
bool bein[maxn];
void Tarjan(int rt){
dfn[rt]=low[rt]=++tim;
st[++cnt]=rt;
bein[rt]=true;
for(int i=;i<v[rt].size();i++){
int to=v[rt][i];
if(!dfn[to])//正向边
Tarjan(to),low[rt]=min(low[rt],low[to]);
else if(bein[to])//反向边
low[rt]=min(low[rt],dfn[to]);
}
if(dfn[rt]==low[rt]){
scc_cnt++;int k;
do {
k=st[cnt--];
belong[k]=scc_cnt;
bein[k]=false;
size[scc_cnt]++;
}while(k^rt);
}
}
int indu[maxn],outdu[maxn];
int main()
{
// freopen("schlnet.in","r",stdin);
// freopen("schlnet.out","w",stdout);
int n;scanf("%d",&n);int y;
for(int i=;i<=n;i++)
while(cin>>y){
if(y==)
break;
v[i].push_back(y);
}
for(int i=;i<=n;i++)
if(!dfn[i]) Tarjan(i);//跑Tarjan缩点
// 然后接下来就判断一下 如果两个点不是同一个强连通分量中 就连上一条边
for(int i=;i<=n;i++)
for(int j=;j<v[i].size();j++){
if(belong[i]!=belong[v[i][j]])
{
indu[belong[v[i][j]]]++,outdu[belong[i]]++;
}
}
int ans=,ans2=;
for(int i=;i<=scc_cnt;i++){
if(indu[i]==)
ans++;
if(outdu[i]==) ans2++;
}
if(scc_cnt==) cout<<<<endl<<;
else cout<<ans<<" "<<endl<<max(ans,ans2)<<endl;
return ;
}
洛谷 P2746 [USACO5.3]校园网Network of Schools schlnet Tarjan强连通分量的更多相关文章
- 洛谷 P2746 [USACO5.3]校园网Network of Schools (Tarjan,SCC缩点,DAG性质)
P2746 [USACO5.3]校园网Network of Schools https://www.luogu.org/problem/P2746 题目描述 一些学校连入一个电脑网络.那些学校已订立了 ...
- 洛谷 P2746 [USACO5.3]校园网Network of Schools 解题报告
P2746 [USACO5.3]校园网Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作"接受学校&q ...
- 洛谷P2746 [USACO5.3]校园网Network of Schools
题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...
- 洛谷 P2746 [USACO5.3]校园网 Network of Schools 题解
Tarjan 模板题 第一问就是缩点之后看有多少个入度为零的点就好了. 第二问是在缩点后将每个点的入度和出度都求出(只要有入度或出度就置为1),然后比较哪个有值的多,将多的作为答案输出.原因是由题可得 ...
- 洛谷 P2746 [USACO5.3]校园网Network of Schools
题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...
- P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools
P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学 ...
- P2746 [USACO5.3]校园网Network of Schools(Tarjan)
P2746 [USACO5.3]校园网Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 ...
- 洛谷P2746 USACO5.1 校园网
题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...
- 【luogu P2746 [USACO5.3]校园网Network of Schools】 题解
题目链接:https://www.luogu.org/problemnew/show/P2812 注意:判断出入度是否为0的时候枚举只需到颜色的数量. 坑点:当只有一个强连通分量时,不需要再添加新边. ...
随机推荐
- [转]java常用正则表达式
只能输入数字:"^[0-9]*$". 只能输入n位的数字:"^\d{n}$". 只能输入至少n位的数字:"^\d{n,}$". 只能输 ...
- 2019-4-12-WPF-绑定的默认模式
title author date CreateTime categories WPF 绑定的默认模式 lindexi 2019-04-12 09:38:58 +0800 2019-04-12 09: ...
- 测试驱动开发实践—从testList开始
[内容指引]运行单元测试:装配一条数据:模拟更多数据测试列表:测试无搜索列表:测试标准查询:测试高级查询. 一.运行单元测试 我们以文档分类(Category)这个领域类为例,示范如何通过编写测试用例 ...
- 【37.48%】【hdu 2587】How far away ?(3篇文章,3种做法,LCA之ST算法(RMQ))
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- Visual Studio Team Services使用教程【4】:默认团队checkin权限修改
2017.4.23之后建议朋友看下面的帖子 TFS2017 & VSTS 实战(繁体中文视频) Visual Studio Team Services(VSTS)与敏捷开发ALM实战关键报告( ...
- nixyx —— 一个小巧的项目工程/编译文件生成器(构建系统?)
恩..nixyx确实算不上是一个构建系统. 所谓构建系统,比如GNU的Autotools,那是一套很完整的构建体系,包括了程序的配置,编译和安装三大部分. 类似的软件还有:google的gyp.腾讯的 ...
- spring-redis-session 自定义 key 和过期时间
对于分布式应用来说,最开始遇到的问题就是 session 的存储了,解决方案大致有如下几种 使用 spring-session 它可以把 session 存储到你想存储的位置,如 redis,mysq ...
- Java 连接 SQL Server 数据库
//连接数据库 public Connection getConnection(){ //url为绝对路径 String url="jdbc:sqlserver://127.0.0.1:14 ...
- IntelliJ Idea中的 Facets 与 Artifacts
在公司和家用电脑上不同版本的idea做实验发现过程中会有些不同,遇到过一些问题,也正是这些问题使得自己能更进一步了解项目构建过程中的细节,特别记录一下. 这个是[温故知新] Java web 开发 ...
- 【小技巧】在PS中测量图层间的边距
今天学到了一个小技巧,前端切页面时会很方便,就是测量间距margin的. 在ps中,选中某个图层,然后按住ctrl键,再移动鼠标,就可以出现这个图层距其他元素的边距,这个太方便了.在此记录一下,免的以 ...