题目描述

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

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

输入格式

输入文件的第一行包括一个正整数 NN,表示网络中的学校数目。学校用前 NN 个正整数标识。

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

输出格式

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

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

第二行应该包括一个非负整数,表示子任务 B 的解。

输入输出样例

输入 #1复制

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

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缩点]的更多相关文章

  1. P2746 [USACO5.3]校园网Network of Schools tarjan 缩点

    题意 给出一个有向图,A任务:求最少需要从几个点送入信息,使得信息可以通过有向图走遍每一个点B任务:求最少需要加入几条边,使得有向图是一个强联通分量 思路 任务A,比较好想,可以通过tarjan缩点, ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 数学建模之优劣解距法(TOPSIS)

    优劣解距法简称TOPSIS,是一种综合评价方法,利用原始数据反映各评价方案之间的差距 优劣解距法的步骤通常为: 先将原始数据针具做正向化处理,得到正向化矩阵 再对正向化矩阵标准化处理以消除各指标纲量的 ...

  2. Linux用户在第一次登录时强制更改初始密码

    迫使用户更改密码 如果你想迫使用户更改其密码,请使用下面这个命令. $ sudo chage -d0 <user-name>   最初,“-d <N>”选项应该被设成密码的“有 ...

  3. 13、FrameRely

    Frame Relay 美国国家标准化协会(American National Standard Institute,简称ANSI)国际电信联盟远程通信标准化组 ITU-T 1.是由ITU和ANSI制 ...

  4. 探究HashMap1.8的扩容

    扩容前 扩容后 机制 else { // preserve order Node<K,V> loHead = null, loTail = null;//低指针 Node<K,V&g ...

  5. web语义化这个坑

    什么是wen语义化:https://www.zhihu.com/question/20455165 标签大全:http://www.w3school.com.cn/tags/tag_html.asp ...

  6. DBSync如何连接并同步MySQL

    DBSync支持各种异构数据库之间的同步,如Access.SQL Server.Oracle.MySQL.DB2等,但很多用户在同步MySQL时遇到问题,这里讲述一下解决措施. 1.问题现象DBSyn ...

  7. 《Android Studio实战 快速、高效地构建Android应用》--三、重构代码

    要成为高效的Android程序员,需要头脑灵活,能够在开发.调试和测试的过程中重构代码,重构代码最大的风险是可能会引入意外的错误,Android Studio通过分析某些具有危险性的重构操作来降低风险 ...

  8. [git]git入门

    usage: git [--version] [--help] [-C <path>] [-c name=value] [--exec-path[=<path>]] [--ht ...

  9. Codeforces_844

    A.统计字母个数. #include<bits/stdc++.h> using namespace std; string s; int n; map<char,int> mp ...

  10. Codeforces_733_C

    http://codeforces.com/problemset/problem/733/C 从后往前一个个b对应一组组a. #include<iostream> #include< ...