2022-05-15:N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件; 问题2:至
2022-05-15:N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。
问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件;
问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后。
经过若干次传送,网络内所有的学校最终都能得到软件。
2 <= N <= 1000。
从题意中抽象出的算法模型, 给定一个有向图,求:
- 至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点;
- 至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点。
测试链接 : http://poj.org/problem?id=1236,
注册一下 -> 页面上点击"submit" -> 语言选择java,
然后把如下代码粘贴进去, 把主类名改成"Main", 可以直接通过。
强连通分量练习题目。
答案2022-05-15:
tarjan算法。
代码用golang编写。代码如下:
package main
import "fmt"
var sc = []int{5, 2, 4, 3, 0, 4, 5, 0, 0, 0, 1, 0}
var ii = 0
func next() int {
ii++
return sc[ii-1]
}
func hasNext() bool {
return ii < len(sc)
}
func main() {
for hasNext() {
n := next()
edges := make([][]int, 0)
for i := 0; i <= n; i++ {
edges = append(edges, make([]int, 0))
}
for from := 1; from <= n; from++ {
to := 0
to = next()
for to != 0 {
edges[from] = append(edges[from], to)
to = next()
}
}
scc := NewStronglyConnectedComponents(edges)
sccn := scc.getSccn()
in := make([]int, sccn+1)
out := make([]int, sccn+1)
dag := scc.getShortGraph()
for i := 1; i <= sccn; i++ {
for _, j := range dag[i] {
out[i]++
in[j]++
}
}
zeroIn := 0
zeroOut := 0
for i := 1; i <= sccn; i++ {
if in[i] == 0 {
zeroIn++
}
if out[i] == 0 {
zeroOut++
}
}
fmt.Println(zeroIn)
fmt.Println(sccn == 1, 0, getMax(zeroIn, zeroOut))
}
}
func getMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}
type StronglyConnectedComponents struct {
nexts [][]int
n int
stack []int
stackSize int
dfn []int
low []int
cnt int
scc []int
sccn int
}
// 请保证点的编号从1开始,不从0开始
// 注意:
// 如果edges里有0、1、2...n这些点,那么容器edges的大小为n+1
// 但是0点是弃而不用的,所以1..n才是有效的点,所以有效大小是n
func NewStronglyConnectedComponents(edges [][]int) *StronglyConnectedComponents {
ans := &StronglyConnectedComponents{}
ans.nexts = edges
ans.init()
ans.scc0()
return ans
}
func (this *StronglyConnectedComponents) init() {
this.n = len(this.nexts)
this.stack = make([]int, this.n)
this.stackSize = 0
this.dfn = make([]int, this.n)
this.low = make([]int, this.n)
this.cnt = 0
this.scc = make([]int, this.n)
this.sccn = 0
this.n--
}
func (this *StronglyConnectedComponents) scc0() {
for i := 1; i <= this.n; i++ {
if this.dfn[i] == 0 {
this.tarjan(i)
}
}
}
func (this *StronglyConnectedComponents) tarjan(p int) {
this.cnt++
this.dfn[p] = this.cnt
this.low[p] = this.cnt
this.stack[this.stackSize] = p
this.stackSize++
for _, q := range this.nexts[p] {
if this.dfn[q] == 0 {
this.tarjan(q)
}
if this.scc[q] == 0 {
if this.low[p] > this.low[q] {
this.low[p] = this.low[q]
}
}
}
if this.low[p] == this.dfn[p] {
this.sccn++
top := 0
for {
this.stackSize--
top = this.stack[this.stackSize]
this.scc[top] = this.sccn
if top == p {
break
}
}
}
}
func (this *StronglyConnectedComponents) getScc() []int {
return this.scc
}
func (this *StronglyConnectedComponents) getSccn() int {
return this.sccn
}
func (this *StronglyConnectedComponents) getShortGraph() [][]int {
shortGraph := make([][]int, 0)
for i := 0; i <= this.sccn; i++ {
shortGraph = append(shortGraph, make([]int, 0))
}
for u := 1; u <= this.n; u++ {
for _, v := range this.nexts[u] {
if this.scc[u] != this.scc[v] {
shortGraph[this.scc[u]] = append(shortGraph[this.scc[u]], this.scc[v])
}
}
}
return shortGraph
}
执行结果如下:
2022-05-15:N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件; 问题2:至的更多相关文章
- 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据
http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...
- 安装xmlspy之后,链接及邮箱等都用这个软件打开,怎样取消?
安装xmlspy之后,链接及邮箱等都用这个软件打开,怎样取消? 安装xmlspy之后,大部分的链接就会用这个软件打开,比较糟心.所以尝试很多的方法,终于解决了. (1)打开控制面板,找到默认程序: ( ...
- oracle12安装软件后安装数据库,然后需要自己配置监听
oracle12安装软件后安装数据库,然后需要自己配置监听 没想到你是这样的oracle12: 不能同时安装软件和数据库,分别安装之后,\NETWORD\ADMIN\下面竟然没有listener.or ...
- 软件工程师需要了解的网络知识:从铜线到HTTP(一)—— 前言
转自:https://lvwenhan.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/485.html?hmsr=toutiao.io&utm_medium ...
- Day 18 软件管理3之搭建网络仓库
搭建一个网络仓库 服务端: 10.0.0.200 1.准备软件包( 1.光盘 2.缓存 3.联网下载 4.同步 ) 2.通过p共享软件包存放的目录 3.将光盘中的软件包都拷贝至p的共享目录下 4. ...
- MySQL 4.1-5.0-5.1-5.5-5.6各版本的主要区别
各版本的一些命令差异: show innodb status\G mysql-5.1 show engines innodb status\G mysql-5.5 关于grant授权 mysql ...
- 2015.05.15,外语,学习笔记-《Word Power Made Easy》 01 “如何讨论人格特点”
2015.03.17,外语,读书笔记-<Word Power Made Easy> 01 “如何讨论人格特点”学习笔记 SESSIONS 1 本来这些章节都是在一两年前学习的,现在趁给友人 ...
- Case of the Zeros and Ones 分类: CF 2015-07-24 11:05 15人阅读 评论(0) 收藏
A. Case of the Zeros and Ones time limit per test 1 second memory limit per test 256 megabytes input ...
- 2016/05/15 ThinkPHP3.2.2 表单自动验证实例 验证规则的数组 直接写在相应的控制器里
使用TP 3.2框架 验证规则也可以写到模型里,但感觉有些麻烦, 一是有时候不同页面验证的方式会不一样, 二是看到这个 Add 事件里的代码,就清楚要接收什么数据,如何验证数据能够在第一眼有个大 ...
- 2015.05.15,外语,学习笔记-《Word Power Made Easy》 02 “如何谈论医生”
包括Sessions 4-6: Prefix Person,nous,etc. Practice,etc. Adjective internus内部 internist [ɪn'tɝnɪst] n.内 ...
随机推荐
- scrcpy投屏软件
Android很好用得scrcpy 投屏软件: 下载传送门:https://github.com/Genymobile/scrcpy/releases 1.下载解压包后,解压至自己得电脑目录,并复制目 ...
- (转载)Python 浅析线程(threading模块)和进程(process)
线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 进程与线程 什么 ...
- Java笔记第二弹
List常用集合子类的特点 ArrayList底层数据结构是数组 查询快,增删慢 LinkedList底层数据结构是链表 查询慢,增删快 练习: //ArrayList实现 import java.u ...
- 安装node.js教程------深入使用Vue
教程 1.下载nodejs引擎 网址:https://nodejs.org/en/download/ 选择32-bit或者64-bit都行 2.下载最新版npm.zip压缩包 网址:http://no ...
- 声网 X 远程超声:实时音视频解决基层“看病难” 推动医疗资源均衡化
实时互联网像触角一样,通过情景的共享延伸开来,链接着我们彼此的线下.线上生活,形成一张不可分割的网络.随着社交直播.在线教育.视频会议成为大众生活不可或缺的一部分的同时,智能手表.智能作业灯.视频双录 ...
- 如果您喜欢我的博客可以进行RSS订阅
如果喜欢我的博客,你也可以订阅我的博客 http://www.cnblogs.com/yhm138/rss 有时间的话我会写一篇菜鸟玩转RSS的介绍,或者你看这篇推送 2020-12-15填坑 我理解 ...
- 【读书笔记】格子路径计数LatticePathEnumeration 学一半的笔记
流水账流水账这篇什么都不是 目录 方法 10.2 Lattice paths without restrictions 无限制格子路径 2维的例子,从(a,b)到(c,d),允许(0,1)和(1,0) ...
- 基于springboot实现SSM整合
(1)SpringBoot整合Spring(不存在) (2)SpringBoot整合SpringMVC(不存在) (3)SpringBoot整合MyBatis(主要) 一.新建springboot项目 ...
- 20张图说清楚 IP 协议
大家好,我是风筝 轻解网络系列又来了,今天咱们说说 IP 协议,这可是网络协议中最最核心的一个协议了,还记得我们刚刚知道什么是IP地址.怎么给电脑修改 IP 的时候吗?今天我们就来探究一下 IP 协议 ...
- 罗技GHUB怎么写入板载内存
本文以自用罗技MX518复刻版鼠标作为例子,让大家怎么学会把logitech G HUB的设置写入鼠标板载内存,并且一键切换各组板载设置. 首先点击最下方的启用,让软件设置鼠标各项设定 启用软件的设定 ...