概述「DAG加边至强连通」模型&&luoguP2746校园网Network of Schools
模型概述

有一DAG,问最少加多少条边能够使图强连通。
题目描述
一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中。
你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务 A)。更进一步,我们想要确定通过给任意一个学校发送新软件,这个软件就会分发到网络中的所有学校。为了完成这个任务,我们可能必须扩展接收学校列表,使其加入新成员。计算最少需要增加几个扩展,使得不论我们给哪个学校发送新软件,它都会到达其余所有的学校(子任务 B)。一个扩展就是在一个学校的接收学校列表中引入一个新成员。
输入输出格式
输入格式:
输入文件的第一行包括一个整数 N:网络中的学校数目(2 <= N <= 100)。学校用前 N 个正整数标识。
接下来 N 行中每行都表示一个接收学校列表(分发列表)。第 i+1 行包括学校 i 的接收学校的标识符。每个列表用 0 结束。空列表只用一个 0 表示。
输出格式:
你的程序应该在输出文件中输出两行。
第一行应该包括一个正整数:子任务 A 的解。
第二行应该包括子任务 B 的解。
题目分析
第一问非常简单,就是缩点之后求入度为零的点个数。
至于第二问……一开始我想了很久,后来发现好像想复杂去了。
先加边再删边
我一开始想到的是类似于floyd的想法,来试图删去“多余的边”。
这里对于多余的边的定义是:删去这些边后不会改变图中两两点对的连通性。
那么对于点$x$,将它与所有不能到达的点$y$连边,最后再考虑哪些边是可删去的多余边。
但是这样很冗余,同时计算出的答案是会偏大的……而且我后来发现好像floyd做不到这个操作?
从图的性质考虑
先不来考虑森林(其实森林的情况也一样)比如说这样一张图:

标红的是入度为零的点;标蓝的是出度为零的点。
按照之前的想法,那就是把点1,2,3,4与其他所有它们不能到达的点相连。
但是可以发现对于点5,6来说,是能够到达所有点的;对于点2来说,它只能够到达自身;并且,所有点都能够到达点2。
那么只需要给点2向点5,6连边,就能够使图成为强连通。
更为普遍的情况则是,红点有$x$个;蓝点有$y$个,则最少加边数为$max\{x,y\}$。
#include<bits/stdc++.h>
const int maxn = ;
const int maxm = ; int tim,dfn[maxn],low[maxn],degOut[maxn],degInn[maxn];
int stk[maxn],cnt;
int col[maxn],cols;
int edgeTot,edges[maxm],nxt[maxm],head[maxn];
int n,ans; int read()
{
char ch = getchar();
int num = ;
bool fl = ;
for (; !isdigit(ch); ch = getchar())
if (ch=='-') fl = ;
for (; isdigit(ch); ch = getchar())
num = (num<<)+(num<<)+ch-;
if (fl) num = -num;
return num;
}
void addedge(int u, int v)
{
edges[++edgeTot] = v, nxt[edgeTot] = head[u], head[u] = edgeTot;
}
void tarjan(int x)
{
dfn[x] = low[x] = ++tim;
stk[++cnt] = x;
for (int i=head[x]; i!=-; i=nxt[i])
{
int v = edges[i];
if (!dfn[v])
tarjan(v),
low[x] = std::min(low[x], low[v]);
else if (!col[v])
low[x] = std::min(low[x], dfn[v]);
}
if (low[x]==dfn[x]){
col[x] = ++cols;
for (; stk[cnt]!=x; cnt--)
col[stk[cnt]] = cols;
cnt--;
}
}
int main()
{
memset(head, -, sizeof head);
n = read();
for (int i=; i<=n; i++)
{
int x;
while (x = read())
addedge(i, x);
}
for (int i=; i<=n; i++)
if (!dfn[i]) tarjan(i);
for (int i=; i<=n; i++)
for (int j=head[i]; j!=-; j=nxt[j])
if (col[i]!=col[edges[j]])
degInn[col[i]]++, degOut[col[edges[j]]]++;
for (int i=; i<=cols; i++)
if (!degOut[i]) ans++;
printf("%d\n",ans);
if (cols==) printf("0\n");
else{
int cnta = , cntb = ;
for (int i=; i<=cols; i++)
{
if (degInn[i]==) cnta++;
if (degOut[i]==) cntb++;
}
printf("%d\n",std::max(cnta, cntb));
}
return ;
}
END
概述「DAG加边至强连通」模型&&luoguP2746校园网Network of Schools的更多相关文章
- 概述「并查集补集转化」模型&&luoguP1330 封锁阳光大学
奇妙的模型转化以及并查集思想 模型概述 有图$G=(V,E)$,初始所有点为白色,现在要将其中一些点染为黑色,要求染色后满足:$∀(u,v)∈E$,$∃col_u!=col_v$.求最小染色点数. 题 ...
- 洛谷 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 schlnet Tarjan强连通分量
schlnet ★★★ 输入文件:schlnet.in 输出文件:schlnet.out 简单对比时间限制:1 s 内存限制:128 MB 描述 一些学校连入一个电脑网络.那些学校已订 ...
- 【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,前篇(2)
Lighting和Shading(2)镜面反射的控制和模拟次级表面散射技术 http://www.4gamer.net/games/216/G021678/20140703095/index_2.ht ...
- 「About Blockchain(一)」达沃斯年会上的区块链
「About Blockchain(一)」 --达沃斯年会上的区块链 写在前面:1月23日到26日,在瑞士达沃斯召开了第48届世界经济论坛.这个新闻本没有引起我格外的关注,直到前两天张老师分享给我一篇 ...
- 「雅礼集训 2017 Day1」 解题报告
「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...
- LOJ#10064. 「一本通 3.1 例 1」黑暗城堡
LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...
- 「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie
#10056. 「一本通 2.3 练习 5」The XOR-longest Path 题目描述 原题来自:POJ 3764 给定一棵 nnn 个点的带权树,求树上最长的异或和路径. 输入格式 第一行一 ...
- 「Unity卡牌自走棋」项目NABCD分析
项目 内容 这个作业属于哪个课程 2021学年春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-初次邂逅,需求分析 在这个课程的目标是 锻炼在大规模开发中的团队协作能力 这个作业在哪个具体方 ...
随机推荐
- (转)linux route命令深入浅出与实战案例精讲
linux route命令深入浅出与实战案例精讲 http://blog.51cto.com/oldboy/1119453 深入浅出之-route命令实战使用指南 http://blog.51cto. ...
- jQuery 间歇式无缝滚动特效分享(三张图片平行滚动)
最近项目中门户首页需要做出图片间歇式无缝滚动特效,但是在网上找资料都是不太理想,不过可以指导.最后自己写了一个demo实现了这个特效,分享出来. 1.jquery.cxscroll.js /*! * ...
- FZU 2202——犯罪嫌疑人——————【思维题】
犯罪嫌疑人 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...
- Java并发包concurrent类简析
1.ConcurrentHashMap ConcurrentHashMap是线程安全的HashMap的实现. 1)添加 put(Object key , Object value) Concurren ...
- mvn install报错
好不容易第一次部署运行报错: [INFO] BUILD FAILURE[INFO] ---------------------------------------------------------- ...
- sharepoint2007就地升级2010系列(五)升级到sharepoint2010
---恢复内容结束--- 大家下午好 今天我们来完成最后一步,sharepoint2007升级2010.其实我反倒没有那么紧张了,因为我最担心的数据库升级,已经过了. OK,话不多说,让我们直接开始吧 ...
- What is mobile platform?
高屋建瓴 From Up to Down Outside into inside The Internet Of Things. http://wenku.baidu.com/view/5cdc026 ...
- Struts2_BBS2009小实战
Struts2_BBS2009准备:链接: http://pan.baidu.com/s/1nvTZz9R 密码: 875a ext3.0_直接部署运行:链接: http://pan.baidu.co ...
- pure-ftp 修改用户信息
1.修改用户test的密码 [root@localhost bin]# ./pure-pw passwd test #修改密码 Password: Enter it again: [root@loca ...
- check_mk 分布式监控
http://mathias-kettner.com/checkmk_wato_distributed.html peer(贵族) 管理多个slave 复制配置文件 /etc/check_mk/con ...