P2746 [USACO5.3]校园网Network of Schools [tarjan缩点]
题目描述
一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意即使 BB 在 AA 学校的分发列表中,AA 也不一定在 BB 学校的列表中。
你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务 A)。更进一步,我们想要确定通过给任意一个学校发送新软件,这个软件就会分发到网络中的所有学校。为了完成这个任务,我们可能必须扩展接收学校列表,使其加入新成员。计算最少需要增加几个扩展,使得不论我们给哪个学校发送新软件,它都会到达其余所有的学校(子任务 B)。一个扩展就是在一个学校的接收学校列表中引入一个新成员。
输入格式
输入文件的第一行包括一个正整数 NN,表示网络中的学校数目。学校用前 NN 个正整数标识。
接下来 NN 行中每行都表示一个接收学校列表(分发列表),第 i+1i+1 行包括学校 ii 的接收学校的标识符。每个列表用 00 结束,空列表只用一个 00 表示。
输出格式
你的程序应该在输出文件中输出两行。
第一行应该包括一个正整数,表示子任务 A 的解。
第二行应该包括一个非负整数,表示子任务 B 的解。
输入输出样例
5
2 4 3 0
4 5 0
0
0
1 0
1
2
说明/提示
2 \le N \le 1002≤N≤100。
题目翻译来自NOCOW。
USACO Training Section 5.3
思路
由题意:
第一问: 显然对于每个学校能到达的点都应该染成用一种颜色, 换句话说, 就是求多少个入度为 0 的学校.
第二问: 至少连几条边使得全部的点强连通, 换句话说, 要使得所有点出入度都不为0.
因为有环的存在, 可以考虑直接缩点, 然后统计各强连通块的出入度, 为了使所有点出入度不为0, 只需取入度为0和出度为0的最大值即可.
CODE
#include <bits/stdc++.h>
#define dbg(x) cout << #x << "=" << x << endl using namespace std;
typedef long long LL;
const int maxn = 1e5 + ; int head[maxn], dfn[maxn], low[maxn], st[maxn];
int cnt = , tot = , tim = , top = , n, cl = ;
int vis[maxn];
int color[maxn];
int ans[maxn];
int nxt[maxn];
int circle_size[maxn];
int cas[maxn][];
int in[maxn];
int out[maxn]; /*
head[],结构体edge:存边 dfn[],low[]:tarjan中数组 st[]:模拟栈 out[]:出边 sd[]:强连通分量存储 dq[]:统计答案
*/ template<class T>inline void read(T &res)
{
char c;T flag=;
while((c=getchar())<''||c>'')if(c=='-')flag=-;res=c-'';
while((c=getchar())>=''&&c<='')res=res*+c-'';res*=flag;
} struct Edge{
int nxt, to;
}edge[maxn * ]; inline void BuildGraph(int from, int to)
{
cnt++;
edge[cnt].to = to;
edge[cnt].nxt = head[from];
head[from] = cnt;
} void tarjan(int x)
{
tim++;
dfn[x] = low[x] = tim;
st[top] = x;
top++;
vis[x] = ;
for(int i = head[x] ; i != ; i = edge[i].nxt)
{
int u = edge[i].to;
if(vis[u] == )
{
tarjan(u);
low[x] = min(low[x],low[u]);
}
else if(vis[u] == )
low[x] = min(low[x],dfn[u]);
}
if(dfn[x] == low[x])
{
cl++;
do
{
top--;
color[st[top]] = cl;
vis[st[top]] = -;
}while( st[top] != x );
}
return ;
} int main()
{
scanf("%d",&n);
int q = ;
for ( int i = ; i <= n; ++i ) {
int x;
while(scanf("%d",&x) && x) {
BuildGraph(i, x);
cas[q][] = i, cas[q][] = x;
q++;
}
}
cl = ;
memset(color, , sizeof(color));
memset(vis, , sizeof(vis));
for ( int i = ; i <= n; ++i ) {
if( !vis[i] ) {
tarjan(i);
}
}
for ( int i = ; i < q; ++i ) {
if(color[cas[i][]] != color[cas[i][]]) {
out[color[cas[i][]]]++;
in[color[cas[i][]]]++;
}
}
int num_in = , num_out = ;
for ( int i = ; i <= cl; ++i ) {
if(in[i] == ) {
num_in++;
}
if(out[i] == ) {
num_out++;
}
}
if(cl == ) {
puts("1\n0");
}
else
printf("%d\n%d\n",num_in, max(num_in, num_out));
return ;
}
P2746 [USACO5.3]校园网Network of Schools [tarjan缩点]的更多相关文章
- P2746 [USACO5.3]校园网Network of Schools tarjan 缩点
题意 给出一个有向图,A任务:求最少需要从几个点送入信息,使得信息可以通过有向图走遍每一个点B任务:求最少需要加入几条边,使得有向图是一个强联通分量 思路 任务A,比较好想,可以通过tarjan缩点, ...
- P2746 [USACO5.3]校园网Network of Schools(Tarjan)
P2746 [USACO5.3]校园网Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 ...
- 洛谷 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// POJ1236: Network of Schools
P2746 [USACO5.3]校园网Network of Schools// POJ1236: Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学 ...
- 洛谷 P2746 [USACO5.3]校园网Network of Schools schlnet Tarjan强连通分量
schlnet ★★★ 输入文件:schlnet.in 输出文件:schlnet.out 简单对比时间限制:1 s 内存限制:128 MB 描述 一些学校连入一个电脑网络.那些学校已订 ...
- 洛谷P2746 [USACO5.3]校园网Network of Schools
题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...
- 洛谷 P2746 [USACO5.3]校园网Network of Schools
题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...
- 【luogu P2746 [USACO5.3]校园网Network of Schools】 题解
题目链接:https://www.luogu.org/problemnew/show/P2812 注意:判断出入度是否为0的时候枚举只需到颜色的数量. 坑点:当只有一个强连通分量时,不需要再添加新边. ...
随机推荐
- Windows系统以及谷歌浏览器快捷键,控制台常用命令
win10系统 快捷键 win+D 回到桌面 控制台代码(win+R打开控制台) calc 系统计算器 谷歌浏览器快捷键 ctrl+tab 切换标签页 ctrl+ 1/2...9 数字 切换到第几个标 ...
- centos7 手动设置时间
date -s "2020-02-03 23:13:00" hwclock -w clock -w
- ros中launch启动文件的使用方法
launch文件:通过XML文件实现多节点的配置和启动(可自动启动ROS Master) launch文件中包含很多标签和属性 *launch文件语法 <launch> <node ...
- 通过域名直接访问Linux服务器中的项目
参考:https://blog.csdn.net/m0_37802616/article/details/87623077 https://blog.csdn.net/u013176571/artic ...
- 如何利用开源解码项目开发js视频解码的web应用 系列
介绍web上开发视频业务相关程序的技术演变历程 https://www.cnblogs.com/maoliangwu/articles/12046495.html 介绍ffmpeg asm.js we ...
- python学习记录(六)
0903--https://www.cnblogs.com/fnng/archive/2013/04/21/3034442.html 基本语句的用法 使用逗号输出(想要同时输出文本和变量值,又不希望使 ...
- python书籍推荐以及杂七杂八
黄哥推荐学习Python 10本好书 Python3网络爬虫开发实战 github daily-reading 想对大家说的话 POJ 算法练习 http://openjudge.cn/ http:/ ...
- Codeforces Round #470 (Div. 2) A Protect Sheep (基础)输入输出的警示、边界处理
Bob is a farmer. He has a large pasture with many sheep. Recently, he has lost some of them due to w ...
- [MP3]MP3固件持续分享(2019.1.25)
转载自我的博客:https://blog.ljyngup.com/archives/179.html/ 所有的固件到我的博客就可以下载哦 最后更新于2019.2.1 前言 这篇文章会持续更新不同型号的 ...
- CentOS 6.4安装mongo的php扩展包
最近安装mongo相关内容,因mongodb下载好解压即可使用,在这里我就不多说了,这里我分享下如何安装mongo的php扩展 首先下载扩展包https://github.com/mongodb/mo ...