Network of Schools POJ - 1236 tarjan强连通分量缩点

A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a list of schools to which it distributes software (the “receiving schools”). Note that if B is in the distribution list of school A, then A does not necessarily appear in the list of school B 
You are to write a program that computes the minimal number of schools that must receive a copy of the new software in order for the software to reach all schools in the network according to the agreement (Subtask A). As a further task, we want to ensure that by sending the copy of new software to an arbitrary school, this software will reach all schools in the network. To achieve this goal we may have to extend the lists of receivers by new members. Compute the minimal number of extensions that have to be made so that whatever school we send the new software to, it will reach all other schools (Subtask B). One extension means introducing one new member into the list of receivers of one school. 
Input
The first line contains an integer N: the number of schools in the network (2 <= N <= 100). The schools are identified by the first N positive integers. Each of the next N lines describes a list of receivers. The line i+1 contains the identifiers of the receivers of school i. Each list ends with a 0. An empty list contains a 0 alone in the line.
Output
Your program should write two lines to the standard output. The first line should contain one positive integer: the solution of subtask A. The second line should contain the solution of subtask B.
Sample Input
5
2 4 3 0
4 5 0
0
0
1 0
Sample Output
1
2

题解:

题目第一句话说所有的电脑都是相互连接的,所以不用担心出现森林的情况。

第一步用tarjan进行缩点,重新构图得到一棵树,然后统计树上各点的入度以及出度。

记in为入读为0的点,记out为出度为0的点。

那么我们很显然的要给所有入度为0的点全都分配一套软件,因为他们无法从别的地方得到软件。

所以第一问的答案就是in。

考虑第二问,如果out > in 的话,我们从所有的出度为0的点开始连一条边到入度为0的点去,这样的话,入读为0的点一定会被覆盖,而且有的点甚至有多余1条入边,这无所谓。所以我们只需要添加out条边就可以了。

如果in > out的话,同理。

因此我们添加的边的条数应该为max(in,out)


代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
using namespace std;
const int MAXN = 107;
int head[MAXN];
int cnt;
int DFN[MAXN];
int LOW[MAXN];
int visit[MAXN];
int scc[MAXN];
int belong[MAXN];
int stk[MAXN];int sp;
int index;
int sccnum;
struct edge{ int v; int next; int cost; 
}Es[10007];  
void init(){ sp = sccnum = index = cnt = 0; memset(head,-1,sizeof(head)); memset(visit,0,sizeof(visit)); memset(belong,0,sizeof(belong)); 
}
inline void add_edge(int i,int j,int cost){   Es[cnt].v = j; Es[cnt].cost = cost; Es[cnt].next = head[i]; head[i] = cnt++; 
}   
void tarjan(int u){DFN[u] = LOW[u] = ++index;visit[u] = 1;stk[sp++] = u; for(int e = head[u];e != -1;e = Es[e].next){int v = Es[e].v;if(!DFN[v]){tarjan(v);LOW[u] = min(LOW[u],LOW[v]);}else if(visit[v]){LOW[u] = min(LOW[u],DFN[v]);}}if(DFN[u] <= LOW[u]){//sccnum++;int top;do{top = stk[--sp];belong[top] = sccnum;visit[top] = 0;}while(top != u);}
}int main() {init();int N;scanf("%d",&N);for(int i = 1;i <= N;i++){int num;while(scanf("%d",&num) && num){add_edge(i,num,1);}}for(int i = 1;i <= N;i++){if(!DFN[i])tarjan(i);}set<int> st1,st2;for(int i = 1;i <= N;i++){for(int e = head[i];e != -1;e = Es[e].next){int v = Es[e].v;if(belong[i] == belong[v]) continue;st1.insert(belong[i]);st2.insert(belong[v]);}}if(sccnum == 1){puts("1\n0");return 0;}cout<<sccnum - st2.size()<<endl;cout<<max(sccnum - st1.size(),sccnum - st2.size())<<endl;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6、mysql中字段

对数据表的操作是比较重要的&#xff0c;在实际开发中&#xff0c;日常做的主要工作就是对数据表的操作 对数据表的操作分为两大部分&#xff1a;操作数据表的结构、操作数据表中的数据 组成数据表的基本单元就是字段&#xff0c;所以&#xff0c;接下来先介绍一下mysql中的字…

bzoj3732-Network【Kruskal重构树模板】

正题 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id3732 题目大意 一张图&#xff0c;每次询问两个点&#xff0c;求这两个点之间路径的最大值的最小是多少。 解题思路 构造一颗KruskalKruskalKruskal重构树然后就是模板了。 codecodecode #include<cstd…

在Linux环境下使用Apache部署ASP.NET Core

在前几篇文章中我们一起探讨了如何在Linux环境中安装ASP.NET Core运行时环境及将ASP.NET Core项目部署在Jexus中&#xff0c;这篇文章中我们将探讨如何将ASP.NET Core部署于Apache&#xff08;阿帕奇&#xff09;中。 很幸运能够和大家一起学习和探讨ASP.NET Core本文章运行…

7、mysql中的表结构操作

之前已经介绍了字段以及修饰字段的一些属性&#xff0c;根据特定的对象可以将字段进行组合&#xff0c;这就有了表的概念&#xff0c;接下来介绍一下如何操 作数据表结构。对数据表结构的操作有添加表、修改表、删除表、查看表结构。 添加表 格式&#xff1a;create table […

P3698-[CQOI2017]小Q的棋盘【树形dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3698 题目大意 nnn个点的树&#xff0c;求从111出发走kkk步最多能到多少个节点。(重复走不算) 解题思路 做法与树形背包类似&#xff0c;但是需要注意的是最后不需要返回原点。 fi,j,0/1f_{i,j,0/1}fi,j,0/1​表示第iii个点…

傲娇码农的自我修养

一个热爱自己职业的人一定会对自己的工作充满自豪感&#xff0c;同样&#xff0c;也应该对自己的工作充满热情和自信。对自己的专业能力骄傲而不自满。身为一个码农&#xff0c;如果你热爱自己的工作&#xff0c;我想&#xff0c;你很有可能也是一位傲娇码农。在我的眼里&#…

8、mysql数据表中数据的增删改

已经介绍了数据表的创建、修改和删除&#xff0c;接下来介绍一下如何往数据表中添加数据、修改数据、删除数据 添加数据 # 默认给表中所有字段添加数据&#xff0c;要保证添加的数据列和字段列一致 insert into user values(5,12,wangwu);# 为表中指定的字段添加数据 insert …

P4071-[SDOI2016]排列计数【组合计数,错排】

正题 题目链接:https://www.luogu.com.cn/problem/P4071 题目大意 每次询问n,mn,mn,m。求有多少个nnn的排列使得aiia_iiai​i的数量恰好为mmm个。 解题思路 首先nnn个之中选择mmm个aiia_iiai​i&#xff0c;选择的方案数为CnmC_{n}^mCnm​。剩下的错排就好了 错排推导di(i−…

中国到底有多少个.NET 程序员?都在哪个城市写代码?

中国到底多少个.NET 程序员&#xff0c;对于这个问题&#xff0c;似乎没有一个准确的答案&#xff0c;而且最近很多使用.NET 开发技术的老板在抱怨找不到.NET 开发人员&#xff0c;所以我想基于我的公众号粉丝数据给大家分享下中国的.NET程序员到底有多少&#xff0c;他们也都是…

9、mysql数据表中数据的查询(1)

使用数据库最终要的莫过于查询数据&#xff0c;所以这里将会详细的介绍mysql数据库中查询语句的使用 普通查询 使用基本的select关键字进行查询&#xff0c;其语法及使用如下 # 格式 select [select选项] 字段 [as 别名] from 数据表;# 查询出所有字段的值&#xff0c;不建议…

P4092-[HEOI2016/TJOI2016]树【线段树,倍增】

正题 题目链接:https://www.luogu.com.cn/problem/P4092 题目大意 nnn个点的树要求支持以下操作 给一个点打上标记求一个节点最近的打上了标记的祖先 解题思路 就是求深度最大的打上了标记的祖先&#xff0c;先跑一遍dfsdfsdfs序&#xff0c;然后对于修改操作就在线段树上整…

微软西雅图总部DevOps交流总结

本文转自Study4台湾社区。Study4台湾社区&#xff0c;成立于2011/9/25&#xff0c;希望藉由社群推广的力量&#xff0c;让台下的朋友听到来自不同县市的大师讲课&#xff0c;也让台上年轻一辈的技术传教士能不断的琢磨并且追上大师这是一个社群&#xff0c;社区希望透过分享&am…

12、数据库的设计范式

设计的数据表一般都是根据实际业务实体模型进行创建&#xff0c;为了提高存储的效率&#xff0c;设计数据表时一般按着几个标准进行设计 第一范式每个字段的数据具有原子性&#xff0c;使用字段的数据时不用再解析&#xff0c;可直接使用第二范式表的每一个字段都必须依赖主键…

C# 快速高效率复制对象另一种方式 表达式树

一、需求在代码中经常会遇到需要把对象复制一遍&#xff0c;或者把属性名相同的值复制一遍。比如&#xff1a;public class Student{public int Id { get; set; }public string Name { get; set; } public int Age { get; set; } }public class StudentSecond{public int Id { …

jzoj3783-[NOIP2014模拟8.19]签到题【结论题】

正题 题目链接:https://jzoj.net/senior/#main/show/3783 题目大意 nnn个数&#xff0c;求这个序列中一个非空子集的和是nnn的倍数。 解题思路 可以知道一定有一种解法是一段连续的序列。 证明:设sxs_xsx​表示(∑i1xai)%n(\sum_{i1}^xa_i)\%n(∑i1x​ai​)%n&#xff0c;那么…

13、mysql中视图的应用

是什么 视图是一种有结构没结果的虚拟表&#xff0c;其结构是从基表中产生的&#xff0c;视图主要用于查询数据。在sql层面上来看&#xff0c;视图就是对select查 询语句的封装&#xff0c;我们看到的虚拟表&#xff08;也就是视图&#xff09;就是select语句查询出的结果组成…

P4768-[NOI2018]归程【kruskal重构树,最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P4768 题目大意 nnn个点mmm条边的无向图&#xff0c;然后每条边有水位和长度。 每次询问一个(v,w)(v,w)(v,w)表示从vvv点出发走高度超过www的路径到达一个点xxx使得x∼1x\sim1x∼1的最短路最短。 解题思路 先用DijDijDij跑出…

用C# (.NET Core) 实现抽象工厂设计模式

本文的概念性内容来自深入浅出设计模式一书.上一篇文章讲了简单工厂和工厂方法设计模式 使用的是披萨店的例子. 文将继续使用这个例子, 这里要用到抽象工厂.披萨店的需求变更现在披萨店在各地授权了很多连锁分店, 但是有的分店偷工减料, 使用劣质原料代替标准原料.披萨店老板现…

14、mysql中事务的应用

是什么 事务是一种保护连续操作同时满足&#xff08;实现&#xff09;的一种机制&#xff0c;用来保护数据的完整性&#xff0c;只适用于数据操作&#xff0c;不适用于结构操作&#xff0c;只有 innodb引擎的表具有事务安全的机制。就是说&#xff0c;在一个事务中做一系列的…

P3193-[HNOI2008]GT考试【KMP,dp,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P3193 题目大意 求有多少个长度为nnn的字符串不包含子串sss。 解题思路 考虑dpdpdp&#xff0c;用fi,jf_{i,j}fi,j​表示第iii个已经匹配到jjj时的方案数。 显然这与正常匹配十分相似&#xff0c;我们分为两种情况 ansi1sj…