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的时候枚举只需到颜色的数量. 坑点:当只有一个强连通分量时,不需要再添加新边. ...
随机推荐
- Python经典算法-快速幂
快速幂 问题描述: 计算a ** n % b 其中a.b和n都是32位的非负整数 即求a的n次方对b的余数 问题示例: 例如:2**31%3=2 --- 代码实现如下 class Solution: ...
- 理解Java虚拟机中的栈、堆、堆栈
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 栈区: 每个线程包含一个栈区,栈中只保存方法中(不包括对象的成员变量)的基础数据类型和自定义对象的引用(不 ...
- 踩坑:windows系统下,nodejs版本管理器无法使用n来管理
错误 :在windows系统下,需要npm 一个n来管理nodejs的版本,但是使用npm install -g n命令之后报错 原因 : n 不支持 windows系统 只支持mac系统.
- node + multer存储element-ui上传的图片
说明 element-ui的Upload组件可以帮助我们上传我们的图片到我们的服务器,可以使用action参数上传图片,也可以使用http-request自定义上传方式.这里我们使用自定义的方式上传. ...
- 代理IP批量验证程序
#include <afxinet.h> #include <afxwin.h> #include <iostream> #include <fstream& ...
- Selenium实现微博自动化运营:关注、点赞、评论
目录 Selenium 是什么? 一.核心代码 二.步骤分解 1.打开浏览器 2.访问微博登录页 3.输入账号密码 4.点击登录 5.通过人机验证 6.打开我们的中公题库君首页 7.加一下关注 8.定 ...
- Java.work6 stasic、this、包总结作业20194651
题目一: 编写一个类Computer,类中含有一个求n的阶乘的方法.将该类打包,并在另一包中德Java文件App.java中引入包,在主类中定义Computer类的对象,调用求n的阶乘的方法(n值由参 ...
- java5循环结构一
public class jh_01_循环学习需要用到的知识点 { public static void main(String[] args) { int a = 1;// 把数值1赋值给int类型 ...
- 使用IDEA详解Spring中依赖注入的类型(上)
使用IDEA详解Spring中依赖注入的类型(上) 在Spring中实现IoC容器的方法是依赖注入,依赖注入的作用是在使用Spring框架创建对象时动态地将其所依赖的对象(例如属性值)注入Bean组件 ...
- centos 7 设置 本地更新源
#yum-config-manager --disable \*--屏弊所有更新源#mkdir /r7iso# cd /run/media/{用户名}/CentOS\ 7\ x86_64/ #cp - ...