2022-05-15:N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。
问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件;
问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后。
经过若干次传送,网络内所有的学校最终都能得到软件。
2 <= N <= 1000。
从题意中抽象出的算法模型, 给定一个有向图,求:

  1. 至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点;
  2. 至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点。
    测试链接 : 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
}

执行结果如下:


左神java代码

2022-05-15:N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件; 问题2:至的更多相关文章

  1. 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据

    http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...

  2. 安装xmlspy之后,链接及邮箱等都用这个软件打开,怎样取消?

    安装xmlspy之后,链接及邮箱等都用这个软件打开,怎样取消? 安装xmlspy之后,大部分的链接就会用这个软件打开,比较糟心.所以尝试很多的方法,终于解决了. (1)打开控制面板,找到默认程序: ( ...

  3. oracle12安装软件后安装数据库,然后需要自己配置监听

    oracle12安装软件后安装数据库,然后需要自己配置监听 没想到你是这样的oracle12: 不能同时安装软件和数据库,分别安装之后,\NETWORD\ADMIN\下面竟然没有listener.or ...

  4. 软件工程师需要了解的网络知识:从铜线到HTTP(一)—— 前言

    转自:https://lvwenhan.com/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/485.html?hmsr=toutiao.io&utm_medium ...

  5. Day 18 软件管理3之搭建网络仓库

    搭建一个网络仓库 服务端: 10.0.0.200   1.准备软件包( 1.光盘 2.缓存 3.联网下载 4.同步 ) 2.通过p共享软件包存放的目录 3.将光盘中的软件包都拷贝至p的共享目录下 4. ...

  6. 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 ...

  7. 2015.05.15,外语,学习笔记-《Word Power Made Easy》 01 “如何讨论人格特点”

    2015.03.17,外语,读书笔记-<Word Power Made Easy> 01 “如何讨论人格特点”学习笔记 SESSIONS 1 本来这些章节都是在一两年前学习的,现在趁给友人 ...

  8. 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 ...

  9. 2016/05/15 ThinkPHP3.2.2 表单自动验证实例 验证规则的数组 直接写在相应的控制器里

    使用TP 3.2框架 验证规则也可以写到模型里,但感觉有些麻烦, 一是有时候不同页面验证的方式会不一样, 二是看到这个   Add  事件里的代码,就清楚要接收什么数据,如何验证数据能够在第一眼有个大 ...

  10. 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.内 ...

随机推荐

  1. 共享USB打印机设置方法

    打印机共享 一.准备 所有计算机在同一个网段. 所有计算机在同一个工作组,组名可以自定义,默认WORKGROUP. 使用超级管理员用户,目的是为了激活guest用户.验证之后可以不需要此前提. 二.主 ...

  2. python通过轮子安装第三方库(以Wordcloud为例)

    1.查看python版本 直接输入如下命令: python 执行结果如下: 我们可以直到,本机的python版本为: AMD64bit 3.11版本python 2.下载合适python版本的轮子 下 ...

  3. 30天帮你一步步学会Python的开源项目

    最近发现一个不错的免费开源学习项目:30天学会Python 如果您最近有学习Python的打算,不妨看看这个是否适合你? 项目地址:https://github.com/Asabeneh/30-Day ...

  4. DVWA-CSRF(跨站请求伪造)

    csrf(Cross-site request forgery)跨站请求伪造:攻击者诱导用户访问第三方网站,在第三方网站中携带恶意代码,向被攻击者发送请求 原理可以这样来说 用户在访问了一个后台管理网 ...

  5. Python学习笔记--文件的相关操作

    文件的读取操作 读操作 实现: read()--读完 read(10)--读取10个字节 readline()--将所有行并到一行输出 readlines()--一次读取一行 文件的关闭: 实现: 上 ...

  6. 记一次生产频繁发生FullGC问题

      问题发现 早上过来,饭都没来的及吃,运维就给我发来信息,说是某个接口调用大量超时.因为最近这个接口调用量是翻倍了,所以我就去检查了下慢SQL,发现确实是有较多的慢SQL,所以我就缩减了查询的时间范 ...

  7. C# 动态创建类,动态创建表,支持多库的数据库维护方案

    1.创建表 SqlSugar支持了3种模式的建表,非常的灵活,可以MYSQL MSSQL ORACLE等用同一语法创建数据库,不需要考虑数据库的兼容性 中间标准: string  大文本 5.1.3. ...

  8. Vue中使用axios发起POST请求成功,却被挂起

    服务器能接收请求并处理,控制台没有报错,axios().catch也没有捕获异常.随后查看控制台网络页,发现被挂起 在Stack搜到同问题,上面说将axios()函数返回用.then查看被挂起信息.n ...

  9. kafka rebalance你真的了解吗

    介绍 今天主要分享一下 kafka 的 rebalance,在 kafka 中,rebalance 是一个十分重要的概念,很多时候引发的一些问题可能都是由于 rebalance 引起的,rebalan ...

  10. order by是怎么工作的?

    order by是怎么工作的? 在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求.还是以我们前面举例用过的市民表为例,假设你要查询城市是"杭州"的所有人名字 ...