题目描述

一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中。

你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务 A)。更进一步,我们想要确定通过给任意一个学校发送新软件,这个软件就会分发到网络中的所有学校。为了完成这个任务,我们可能必须扩展接收学校列表,使其加入新成员。计算最少需要增加几个扩展,使得不论我们给哪个学校发送新软件,它都会到达其余所有的学校(子任务 B)。一个扩展就是在一个学校的接收学校列表中引入一个新成员。

输入格式

输入文件的第一行包括一个整数 N:网络中的学校数目(2 <= N <= 100)。学校用前 N 个正整数标识。

接下来 N 行中每行都表示一个接收学校列表(分发列表)。第 i+1 行包括学校 i 的接收学校的标识符。每个列表用 0 结束。空列表只用一个 0 表示。

输出格式

你的程序应该在输出文件中输出两行。

第一行应该包括一个正整数:子任务 A 的解。

第二行应该包括子任务 B 的解。

输入输出样例

输入 #1复制

5
2 4 3 0
4 5 0
0
0
1 0
输出 #1复制

1
2

说明/提示

题目翻译来自NOCOW。

USACO Training Section 5.3

Tarjan模板题

首先进行tarjan缩点,重新建图

两个任务分别解决:

任务一:求有多少个缩完点后入度为0的强连通分量。

如果一个强连通分量入度为0,不会有其他的点给他送来软件,所以只能送给他一个副本。如果有边联向他,他就可以从父亲那里获得软件包

任务二:求 入度为0的点 和 出度为0的点 的最大值

第二问的意思就是加上多少条边可以使得整个图强连通。事实上,我们只需要让每个点的入度和出度都不为0

您可以想象环是什么样子(入度出度都是1)

解。

#include<bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
using namespace std;
int n;
#define maxn 109
vector<int> son[maxn];
int dfn[maxn],low[maxn],cnt=,scc_cnt=,st[maxn];
bool bein[maxn];
int scc[maxn];
int s=;
void Tarjan(int x)
{
dfn[x]=++s;
low[x]=s;
bein[x]=;
st[++cnt]=x;
for(int i=;i<son[x].size();i++)
{
int to=son[x][i];
if(!dfn[to])
{
//to没有被访问过
Tarjan(to);
low[x]=min(low[x],low[to]);
}else if(bein[to])
{
low[x]=min(low[x],dfn[to]);
}
}
if(low[x]!=dfn[x])return;
int k;
scc_cnt++;
do
{
k=st[cnt--];
bein[k]=;
scc[k]=scc_cnt;
}while(k!=x);
}
struct node{
int x,y;
}e[maxn];
int m=;
int in[maxn],out[maxn];//入度,出度
signed main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x;
while(scanf("%d",&x)&&x!=)
{
e[++m].x=i;
e[m].y=x;
son[i].push_back(x);
}
}
for(int i=;i<=n;i++)
{
if(!dfn[i])Tarjan(i);
}
for(int i=;i<=n;i++)
{
for(int j=;j<son[i].size();j++)
{
if(scc[i]!=scc[son[i][j]])
{
in[scc[son[i][j]]]++,out[scc[i]]++;
} }
}
int in0=,out0=;
for(int i=;i<=scc_cnt;i++)
{
if(in[i]==)in0++;
if(out[i]==)out0++;
}
int ans=max(in0,out0);
if(scc_cnt==)ans=;//当只有一个强连通分量的时候任务2的答案为1
printf("%d\n%d\n",in0,ans);
return ;
}

洛谷 P2746 [USACO5.3]校园网Network of Schools的更多相关文章

  1. 洛谷 P2746 [USACO5.3]校园网Network of Schools 解题报告

    P2746 [USACO5.3]校园网Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作"接受学校&q ...

  2. 洛谷 P2746 [USACO5.3]校园网Network of Schools (Tarjan,SCC缩点,DAG性质)

    P2746 [USACO5.3]校园网Network of Schools https://www.luogu.org/problem/P2746 题目描述 一些学校连入一个电脑网络.那些学校已订立了 ...

  3. 洛谷P2746 [USACO5.3]校园网Network of Schools

    题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...

  4. 洛谷 P2746 [USACO5.3]校园网 Network of Schools 题解

    Tarjan 模板题 第一问就是缩点之后看有多少个入度为零的点就好了. 第二问是在缩点后将每个点的入度和出度都求出(只要有入度或出度就置为1),然后比较哪个有值的多,将多的作为答案输出.原因是由题可得 ...

  5. 洛谷 P2746 [USACO5.3]校园网Network of Schools schlnet Tarjan强连通分量

    schlnet ★★★   输入文件:schlnet.in   输出文件:schlnet.out   简单对比时间限制:1 s   内存限制:128 MB 描述 一些学校连入一个电脑网络.那些学校已订 ...

  6. P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools

    P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学 ...

  7. P2746 [USACO5.3]校园网Network of Schools(Tarjan)

    P2746 [USACO5.3]校园网Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 ...

  8. 洛谷P2746 USACO5.1 校园网

    题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...

  9. 【luogu P2746 [USACO5.3]校园网Network of Schools】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2812 注意:判断出入度是否为0的时候枚举只需到颜色的数量. 坑点:当只有一个强连通分量时,不需要再添加新边. ...

随机推荐

  1. Echarts案例-折线图

    一:先在官网下载 https://www.echartsjs.com/zh/download.html 然后再建立工程,导入这两个包: 写代码: <!DOCTYPE html> <h ...

  2. UVALive 4254 Processor ——(二分+优先队列处理)

    题目是求最小化最大值,很显然是二分,但是二分以后怎么判断mid是否可行并不容易. 代码参考了网上一个博客的代码.巧妙之处在于一秒一秒的考虑,这样可以把处理速度mid直接转化成1秒内实际的量来解决(避免 ...

  3. 【Python】使用Beautiful Soup等三种方式定制Jmeter测试脚本

    背景介绍 我们在做性能调优时,时常需要根据实际压测的情况,调整线程组的参数,比如循环次数,线程数,所有线程启动的时间等. 如果是在一台Linux机器上,就免不了在本机打开图形页面修改,然后最后传递到压 ...

  4. Chrome浏览器报错:ERR_UNSAFE_PORT

    今天用Chrome浏览器打开一个页面发现报错了:ERR_UNSAFE_PORT. 所以,去搜了一下发现Chrome浏览器是默认一些端口号为非安全端口的. 遇到这个问题建议更换端口号或者更换浏览器打开. ...

  5. 分组背包---P1757 通天之分组背包

    P1757 通天之分组背包 题解 分组背包板子题 k组物品,每组之间相互矛盾,也就是一组里面只能选一个或者不选 分组背包其实和01背包差不多,就是多加一维枚举组数 f[k][j] 前k组中,体积不超过 ...

  6. SOCKET原理(转载)

    SOCKET原理 一.套接字(socket)概念 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息: ...

  7. 【思考】为什么说Bagging减少variance,Boosting减少bias?(转载)

    具体讨论可见于此知乎问题,有很多种理解方向,甚至这一个命题可能本来就不成立!

  8. Linux 全盘搜索关键字

    grep  -Ern  -o  '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25 ...

  9. Build Telemetry for Distributed Services之OpenTracing实践

    官网:https://opentracing.io/docs/best-practices/ Best Practices This page aims to illustrate common us ...

  10. 开发CLI命令行

    命令行工具:CLI 是在命令行终端使用的工具,如git, npm, vim 都是CLI工具.比如我们可以通过 git clone 等命令简单把远程代码复制到本地 和 cli 相对的是图形用户界面(gu ...