题目大意:

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

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

这道题可以看出由连通块知识解决,但问题出在子任务B上。我们应当这样思考:对几个连通块进行加边使得它们合并成一个连通块的效果,便是没有入度或出度为0的连通块。所以我们可以把入度为0的连通块放在左边,出度为0的连通块放在右边,我们要做的,就是建立最少的连接左右两侧连通块的边,使得两侧每个连通块都连着一条边。所以答案便是max{入度为0的连通块个数,入度为1的连通块个数}。

//#define _DEBUG

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std; const int MAX_NODE = 150; struct Block
{
int InDegree, OutDegree;
}_blocks[MAX_NODE];
int _blockCnt; struct Node
{
vector<Node*> Next;
int DfsN, Low;
bool InStack;
Block *BlockIn;
}_nodes[MAX_NODE];
stack<Node*> St;
int _vCount, DfsCnt; void PopStack(Node *cur)
{
Block *curBlock = _blocks + ++_blockCnt;
Node *temp;
do {
temp = St.top();
St.pop();
temp->BlockIn = curBlock;
temp->InStack = false;
} while (temp != cur);
} void Dfs(Node *cur)
{
cur->DfsN = cur->Low = ++DfsCnt;
cur->InStack = true;
St.push(cur);
for (int i = 0; i < cur->Next.size(); i++)
{
if (!cur->Next[i]->DfsN)
{
Dfs(cur->Next[i]);
cur->Low = min(cur->Low, cur->Next[i]->Low);
}
else if (cur->Next[i]->InStack)
cur->Low = min(cur->Low, cur->Next[i]->DfsN);
}
if (cur->Low == cur->DfsN)
PopStack(cur);
} void Tarjan()
{
for (int i = 1; i <= _vCount; i++)
if (!_nodes[i].DfsN)
Dfs(_nodes + i);
} void GetDegree()
{
for (int i = 1; i <= _vCount; i++)
for (int j = 0; j < _nodes[i].Next.size(); j++)
if (_nodes[i].BlockIn != _nodes[i].Next[j]->BlockIn)
{
_nodes[i].BlockIn->OutDegree++;
_nodes[i].Next[j]->BlockIn->InDegree++;
}
} int GetRootCnt()
{
int ans = 0;
for (int i = 1; i <= _blockCnt; i++)
ans += (_blocks[i].InDegree == 0);
return ans;
} int GetLeafCnt()
{
int ans = 0;
for (int i = 1; i <= _blockCnt; i++)
ans += (_blocks[i].OutDegree == 0);
return ans;
} int main()
{
scanf("%d", &_vCount);
for (int u = 1; u <= _vCount; u++)
{
int v;
while(scanf("%d", &v) && v)
_nodes[u].Next.push_back(_nodes + v);
}
Tarjan();
if (_blockCnt == 1)
{
printf("1\n0\n");
return 0;
}
GetDegree();
int rootCnt = GetRootCnt(), leafCnt = GetLeafCnt();
printf("%d\n%d\n", rootCnt, max(rootCnt, leafCnt));
return 0;
}

  

luogu2746 校园网的更多相关文章

  1. 锐捷linux客户端常用命令(主要用来连接校园网或公司局域网)

     锐捷访问校园网,.sh脚本文件rjsu*.sh-u 用户名-P 密码-S 参数1保存密码参数0不保存密码   其实:  直接使用md5认证方式输入用户名密码并且配置好ip之后,重新打开网卡即可有一定 ...

  2. 配置VMware虚拟机用绕过校园网达到无线上网配置方法

    因为平时要用到Vmware这样的工具上虚拟机上网, 但是本人是学生狗,学生狗在学校就要面对大学毒瘤软件--锐捷,而锐捷是不允许有虚拟网卡的存在的,所以上网只能用wifi上.之前试了很久,反正是怎么开都 ...

  3. [机器学习] Ubuntu 软件源更新(校园网)以及问题总结

    最近在折腾Linux,在校园网下怎么能够很好的获取软件很是让我头疼啊~~~ 总结一下吧!!! 首先是校园网的源地址: 清华大学:https://mirrors.tuna.tsinghua.edu.cn ...

  4. 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃

    一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...

  5. 华为HG255D路由器使用OH3C进行中大校园网认证

    之前用的上海贝尔RG100A-AA路由器,被我无情地摧残了,电源按钮挂了,只能换个路由器.由于在校内,使用OP还是比较方便的,网上淘了这款华为HG255D,店主已刷好OP,无线速率300M,想想也是值 ...

  6. Kubuntu 使用YaH3C进行中大校园网认证

    之前都是用路由器连网线上网,我也没注意到inode校园网客户端在linux上的问题.直到前两天把路由器给搞残废了,只能默默的找办法装inode.根据学校网络中心给的教程,在kubuntu上尝试安装in ...

  7. win10搭建代理服务器实现绕过校园网的共享限制--从入门到放弃

    博主所在学校特别坑爹,校园网被电信一家垄断了,而且最恶心的还是电信要求一条网线只能供一台电脑上网,不许接路由器共享网络= =- (还有电信2M价格是380+每年,20m是500每年,而且网速都很慢= ...

  8. NEU校园网登录器

    http://www.cnblogs.com/weidiao/p/5124106.html 改自学长的博客. 我们的目标是写一个程序实现自动登录校园网.而这基于的是表单的post机制. 输入校园网网址 ...

  9. RG100A-AA 中大校园网上网及远程配置

    由于无线网卡用得不爽,wifi经常断,所以想整个路由器,造福群众.在朋友介绍下购得一台已经刷好 Openwrt 的上海贝尔RG100A-AA路由器,根据下面的简单步骤,就能连接上校园网. 一.准备工作 ...

随机推荐

  1. HashMap的尾部遍历问题--Tail Traversing

    在看网上HashMap的resize()设计时,提到尾部遍历.   JDK1.7的HashMap在实现resize()时,新table[]的列表采用LIFO方式,即队头插入.这样做的目的是:避免尾部遍 ...

  2. Less文件的建立

    1.打开DreamWeaver 2.选择 新建 Less       文件名为.less,保存于Less文件夹中 3.声明文档头:@charset "utf-8"; 4.将Less ...

  3. SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(5)SAS宏语言.SQL过程 1. 一个SAS程序可能包含一个或几个语言成分: DATA步或PROC步 全程语句 SAS组件语言(SCL) ...

  4. 01--Java开发中文乱码问题分析

    一.常见的编码格式 1. ASCII码 总共128个字符,用1个字节的低7位表示,0~31是控制字符,32~126是打印字符. 2.  ISO-8859-1 ISO组织在ASCII基础上进行扩展,仍是 ...

  5. Core 项目下使用SQl语句

    public static DataTable ExeQuery(string connectionString, CommandType cmdType, string cmdText) { usi ...

  6. CSS——display:flex

    Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 设为Flex布局以后,子元素的float.clear和vertical-align属性 ...

  7. 一个有趣的 ”Validation of viewstate MAC failed” 错误的发现和解决

    在ASP.NET里面,View State使用较为广泛.它作为一个隐藏字段,可以帮助服务端”记住“客户端的改变,这样客户端 收到服务器对PostBack的响应后,仍然可以展现在PostBack之前设定 ...

  8. Java我来了

    七天的C#集训,第一天接触Java,觉得很多相似的地方,尝试用eclipse码了几句(有些差别,毕竟没有写C#那么流畅),总体来说觉得还不错,对自己接下来要求是,更加熟练并且牢记Java的命令,更加深 ...

  9. ARM处理器的寄存器,ARM与Thumb状态,7中运行模式

     ** ARM处理器的寄存器,ARM与Thumb状态,7中运行模式  分类: 嵌入式 ARM处理器工作模式一共有 7 种 : USR  模式    正常用户模式,程序正常执行模式 FIQ模式(Fast ...

  10. 报错:command not found

    linux中如果是最小化安装的系统,执行命令的时候很多会出现没找到命令 [root@localhost ~]# mtr -bash: mtr: command not found [root@loca ...