POJ1236 Network of Schools

POJ1236 Network of Schools

文章目录

    • Description
    • 题意:
    • 题解:
    • 代码:

Description

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

题意:

给你一些点的连接关系(有向边),具有传递性
然后有两个任务
任务A:
至少要选择多少个点,通过边进行传递,可以经过所有边
任务B:
要使所有点都可以彼此到达,最少要添加多少有向边

题解:

并查集应该可以做吧(但我并没有用)
我们用tarjan来做
我们先来分析和整合题意:
一个强连通分块里面是可以相互到达的,我们可以当做一个点来处理
任务A:
我们可以进行tarjan缩点,如果一个点入度为0,也就是没有其他点指向他,我们就必须选择他,否则这样的点就不会被遍历,那么这个点就是满足要求的
任务B:
其实就是问最少添加几个边可以使得整个图变成强连通图,
如果一个图是强连通图,里面所有点可以互达,就说明每个点入度出度均大于0.
那么缩点后,我们就统计入度为0的A类点数与出度为0的B类点数,只要从B类点生成一条指向A类点的有向线段即可,所以求这两类点的较大值
总结就是:
Tarjan+强连通分量+缩点
代码有详细讲解

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstdio>
using namespace std;
int n,head[10005],cnt=0,col=0,sum;
int top=1,stack[10005],color[10005],dfn[10005],low[10005],vis[10005];//color记录染色后点的颜色。
int in[10005],out[10005];//in和out分别是入度和出度。
struct net
{int to,next;
}e[1000000];
void add(int x,int y)
{cnt++;e[cnt].to=y;e[cnt].next=head[x];head[x]=cnt;
}
void tarjian(int x)
{sum++;dfn[x]=low[x]=sum;stack[top]=x;top++;vis[x]=1;for(int w=head[x];w!=0;w=e[w].next){if(vis[e[w].to]==0){tarjian(e[w].to);low[x]=min(low[x],low[e[w].to]);}else if(vis[e[w].to]==1)low[x]=min(low[x],dfn[e[w].to]);}if(dfn[x]==low[x]){col++;do{top--;color[stack[top]]=col;vis[stack[top]]=-1;}while(stack[top]!=x);}//常规的tarjan缩点 模板 return ;
}
int hym[1000000][3];
int main()
{int i,k=0;cin>>n;for(i=1;i<=n;i++){int x;cin>>x;while(x!=0){k++;add(i,x);hym[k][1]=i;//1表示这条边的始点,2表示这条边的终点 hym[k][2]=x;//记下边,方便之后统计入度和出度。scanf("%d",&x);}}for(i=1;i<=n;i++)if(!vis[i]) tarjian(i);for(i=1;i<=k;i++)if(color[hym[i][1]]!=color[hym[i][2]])//如果相等说明这个点在同一个强连通分量里,否则就是两个强连通分量之间的边//那我们分别计这个边两端的入度和出度 {out[color[hym[i][1]]]++;//始点记出度 in[color[hym[i][2]]]++;//终点记入度 }//同种颜色不需要统计,不同颜色更改出度和入度。int ans1=0,ans2=0;for(i=1;i<=col;i++){//cout<<in[i]<<' '<<out[i]<<endl;if(in[i]==0)  ans1++;if(out[i]==0) ans2++;//寻找出度和入度为0的点数 }if(col==1) cout<<1<<endl<<0;elsecout<<ans1<<endl<<max(ans1,ans2); return 0;
}

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

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

相关文章

【模拟】签订协议(nowcoder 217601)

签订协议 nowcoder 217601 题目大意 给出n个数&#xff0c;现在有一个协议书&#xff0c;让你从1传到n&#xff0c;然后传回1&#xff0c;继续传下去 对于第i个数&#xff0c;如果前面i-1个数已经匹配过了&#xff0c;那么当协议书传过来时即可匹配&#xff0c;否则无法匹配…

P4196-[CQOI2006]凸多边形/[模板]半平面交【计算几何】

正题 题目链接:https://www.luogu.com.cn/problem/P4196 题目大意 给出nnn个凸多边形&#xff0c;求它们交的面积。 解题思路 就是把凸多边形上每条边作为一个半平面限制然后求一遍半平面交就好了。 具体做法是我们先将点按照级角排序&#xff0c;然后以此把半平面加入双端…

连续段问题小结

一个好用的工具——析合树 oi-wiki 例题 CF526F 题意&#xff1a; 给出一个1~nnn的排列&#xff0c;问有多少个区间的值域是连续的。 题解&#xff1a; 线段树单调栈做法 分治做法 析合树做法 图论做法 CF997E 题意&#xff1a; 给出一个1~nnn的排列&#xff0c;有qqq次…

实战中的asp.net core结合Consul集群Docker实现服务治理

一、前言在写这篇文章之前&#xff0c;我看了很多关于consul的服务治理&#xff0c;但发现基本上都是直接在powershell或者以命令工具的方式在服务器上面直接输入consul agent .... 来搭建启动consul集群&#xff0c;一旦把命令工具关掉&#xff0c;则consul无法再后台启动&…

POJ3177 Redundant Paths

POJ3177 Redundant Paths 文章目录Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21945 Accepted: 9056Description In order to get from one of the F (1 < F < 5,000) grazing fields (…

【最小生成树】路线规划(nowcoder 217603)

路线规划 nowcoder 217603 题目大意 给一个无向连通图&#xff0c;问你在经过的边最少的前提下&#xff0c;从1走过所有点&#xff0c;再走回1的最短距离 样例#1 输入样例#1 5 5 5 4 3 4 3 5 2 3 7 1 2 4 2 4 1输出样例#1 26样例解释#1 最少时间的路径: 1 →2 →…

计算几何学习小记

文章目录前言正题平面运算加减乘积常见问题直线/线段规范交点求垂线/点问题判断点在多边形的内/外求两个圆的交点前言 因为懒得画图理解计算几何所以要来这里鼓励一下自己 以后新学的应该也会写在这里。就当我是水博客 应该都是二维的计算几何&#xff0c;三维的有生之年再学 …

[XSY3343] 程序锁(DP)

XSY3343 先考虑如何判定一个填好的序列会不会gg&#xff1a; 若∃p,q,使s′[p1]t′[q1]−1\exist p,q,使s[p1]t[q1]-1∃p,q,使s′[p1]t′[q1]−1且∑i1ps′[i]∑j1qt′[j]≤0\sum_{i1}^{p}s[i]\sum_{j1}^{q}t[j]\leq 0∑i1p​s′[i]∑j1q​t′[j]≤0&#xff0c;则这个序列必g…

Asp.Net Core SignalR 用泛型Hub优雅的调用前端方法及传参

继续学习最近一直在使用Asp.Net Core SignalR(下面成SignalR Core)为小程序提供websocket支持,前端时间也发了一个学习笔记&#xff0c;在使用过程中稍微看了下它的源码,不得不说微软现在真的强大,很多事情都帮你考虑到了,比如使用Redis,使用Redis后,你的websocket就支持横向扩…

Network POJ-3694

Network POJ-3694 文章目录Description题意&#xff1a;样例分析&#xff1a;题解&#xff1a;代码&#xff1a;Description A network administrator manages a large network. The network consists of N computers and M links between pairs of computers. Any pair of com…

【树状数组】递增子序列(金牌导航 数据结构优化DP-1)

递增子序列 金牌导航 数据结构优化DP-1 题目大意 给出一个序列&#xff0c;让你求长度为m的单调递增子序列的个数 输入样例 3 2 1 1 2 7 3 1 7 3 5 9 4 8输出样例 2 12数据范围 1⩽n⩽104,1⩽m⩽100,0⩽ai⩽9876543211\leqslant n \leqslant 10^4,1\leqslant m \leqslant…

使用.NET Core 2.1的Azure WebJobs

WebJobs不是Azure和.NET中的新事物。 Visual Studio 2017中甚至还有一个默认的Azure WebJob模板&#xff0c;用于完整的.NET Framework。 但是&#xff0c;Visual Studio中以某种方式遗漏了.NET Core中WebJobs的类似模板。 在这篇文章中&#xff0c;我使用的是.NET Core 2.1来创…

P3265-[JLOI2015]装备购买【线性基,拟阵贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P3265 题目大意 给出nnn个有权值的mmm元组。求最大独立集&#xff0c;即一个最大的集合且内部元素线性无关。且在集合最大的情况下权值和最小 通俗的说就是没有任何一个元素内被其他元素的倍数和表示。 解题思路 我们考虑线…

【决策单调性】玩具装箱(金牌导航 决策单调性优化DP-1)

玩具装箱 金牌导航 决策单调性优化DP-1 题目大意 给出若干个物品&#xff0c;把iii到jjj个物品装在一起的长度lj−i∑kijaklj-i\sum_{ki}^{j}a_klj−i∑kij​ak​&#xff08;物品必须是连续的&#xff09;&#xff0c;其代价为(lL)2(l L)^2(lL)2&#xff08;L为给出的常数…

HDU4612 Warm up

Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 11184 Accepted Submission(s): 2573HDU4612 Warm up 文章目录Problem Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Problem Description N …

[NOIP2016 提高组] 天天爱跑步(树上差分)

如果没有时间的限制&#xff0c;这题就是对每个点iii&#xff0c;求经过iii的路径数&#xff0c;用树上差分解决即可&#xff1a; 枚举路径x→y{x\to y\{x→y{ a[x]1;a[y]1;a[x]1;a[y]1;a[x]1;a[y]1; a[lca(x,y)]−1;a[fa[lca(x,y)]]−2;a[lca(x,y)]-1;a[fa[lca(x,y)]]-2;a[lc…

.NET Core中的CSV解析库

感谢本篇首先特别感谢从此启程兄的《.NetCore外国一些高质量博客分享》, 发现很多国外的.NET Core技术博客资源, 我会不定期从中选择一些有意思的文章翻译总结一下。.NET Core中的CSV解析库本篇博客来源于.NET Core Totorials的《CSV Parsing In .NET Core》。背景介绍对于初级…

【manacher】双倍回文(金牌导航 manacher-2/luogu 4287)

双倍回文 金牌导航 manacher-2 luogu 4287 题目大意 设串为x&#xff0c;将其取反为x’&#xff0c;定义双倍回文为形如xx’xx’的串 现在给你一个字符串&#xff0c;让你求最大双倍回文子串 输入样例 16 ggabaabaabaaball输出样例 12数据范围 N⩽105N\leqslant 10^5N⩽…

P6178-[模板]Matrix-Tree 定理

正题 题目链接:https://www.luogu.com.cn/problem/P6178 题目大意 给出一个nnn个点mmm条边的无向/有向图。 求所有的生成树/以1为根的外向生成树的权值乘积和。 解题思路 矩阵AAA的行列式表示为det(A)det(A)det(A)&#xff0c;定义为 det(A)∑P(−1)μ(P)∏i1nAi,pidet(A)\…

可达性

来源&#xff1a;牛客网 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 给出一个 0 ≤ N ≤ 105 点数、0 ≤ M ≤ 105 边…