usaco5.3.3 Network of Schools

LightTools宏 vs Python API:光学仿真自动化方案选型指南 本文深入对比了LightTools光学仿真自动化中VBA宏与Python API两种方案。VBA宏内嵌易用,适合固定流程批处理;Python API生态强大,尤其在参数优化算法集成方面优势显著,便于构建复杂工作流。文章结合案例,为不同场景下的技术选型提供清晰指南。 阅读详情

一 原题

Network of Schools
IOI '96 Day 1 Problem 3

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.

PROGRAM NAME: schlnet

INPUT FORMAT

The first line of the input file 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.

SAMPLE INPUT (file schlnet.in)

5
2 4 3 0
4 5 0
0
0
1 0

OUTPUT FORMAT

Your program should write two lines to the output file. The first line should contain one positive integer: the solution of subtask A. The second line should contain the solution of subtask B.

SAMPLE OUTPUT (file schlnet.out)

1
2



二 分析

给定一个有向图,求解:(1)至少需要指定多少个点,使得图中所有顶点都从这些点可达;(2)至少需要增加几条边,使得整个图成为一个强连通图。
很容易想到将原图进行强连通分量缩点,两问的答案分别对应新图中:(1)入度为0的点的数量;(2)max(入度为0的点数,出度为0的点数)。
求强连通分量我实用的是tarjan算法,复杂度O(|V| + |E|)


三 代码

运行结果:
USER: Qi Shen [maxkibb3]
TASK: schlnet
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.000 secs, 4208 KB]
   Test 2: TEST OK [0.000 secs, 4208 KB]
   Test 3: TEST OK [0.000 secs, 4208 KB]
   Test 4: TEST OK [0.000 secs, 4208 KB]
   Test 5: TEST OK [0.000 secs, 4208 KB]
   Test 6: TEST OK [0.000 secs, 4208 KB]
   Test 7: TEST OK [0.000 secs, 4208 KB]
   Test 8: TEST OK [0.000 secs, 4208 KB]
   Test 9: TEST OK [0.000 secs, 4208 KB]
   Test 10: TEST OK [0.000 secs, 4208 KB]
   Test 11: TEST OK [0.000 secs, 4208 KB]

All tests OK.

Your program ('schlnet') produced all correct answers! This is your submission #3 for this problem. Congratulations!


AC代码:
/*
ID:maxkibb3
LANG:C++
PROB:schlnet
*/

#include<cstdio>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;

const int MAXV = 105;

int N;
bool Map[MAXV][MAXV];
vector< int > E[MAXV];

/*** Global Variables for Tarjan ***/
int Cnt;
int Index[MAXV];
int Lowlink[MAXV];
bool Instack[MAXV];
stack< int > S;
vector< vector<int> > Sc;
bool Edges[MAXV][MAXV];

void init() {
    int tmp;
    scanf("%d", &N);
    for(int i = 1; i <= N; i++)
        while(true) {
            scanf("%d", &tmp);
            if(tmp == 0) break;
            E[i].push_back(tmp);
            Map[i][tmp] = true;
        }
}

void tarjan(int _idx) {
    if(Index[_idx] != -1) return;
    Index[_idx] = Lowlink[_idx] = Cnt++;
    S.push(_idx);
    Instack[_idx] = true;

    for(int i = 0; i < E[_idx].size(); i++) {
        int next = E[_idx][i];
        if(Index[next] == -1) {
            tarjan(next);
            if(Lowlink[next] < Lowlink[_idx])
                Lowlink[_idx] = Lowlink[next];
        }
        else if(Instack[next] && 
                Lowlink[_idx] > Index[next]) {
            Lowlink[_idx] = Index[next];
        }
    }
   
    if(Index[_idx] == Lowlink[_idx]) {
        vector<int> new_sc;
        int top_ele;
        do {
            top_ele = S.top();
            new_sc.push_back(top_ele);
            Instack[top_ele] = false;
            S.pop();
        }
        while(top_ele != _idx);
        Sc.push_back(new_sc);
    }
}

void build_graph() { 
    int ssize = Sc.size();
    for(int i = 0; i < ssize; i++)
    for(int j = i + 1; j < ssize; j++)
    for(int k = 0; k < Sc[i].size(); k++)
    for(int l = 0; l < Sc[j].size(); l++) {
        if(Map[Sc[i][k]][Sc[j][l]])
            Edges[i][j] = true;
        if(Map[Sc[j][l]][Sc[i][k]])
            Edges[j][i] = true;
    }
}

void count() {
    if(Sc.size() == 1) {
        printf("1\n0\n");
        return;
    }
    int in_ele, out_ele;
    int in_zero = 0, out_zero = 0;
    for(int i = 0; i < Sc.size(); i++) {
        in_ele = out_ele = 0;
        for(int j = 0; j < Sc.size(); j++) {
            if(Edges[i][j])
                out_ele++;
            if(Edges[j][i])
                in_ele++;
        }
        if(in_ele == 0) in_zero++;
        if(out_ele == 0) out_zero++;
    }
    printf("%d\n%d\n", in_zero, max(in_zero, out_zero));
}

void solve() {
    for(int i = 1; i <= N; i++)
        Index[i] = -1;
    for(int i = 1; i <= N; i++)
        tarjan(i);
    build_graph();
    count();
}

int main() {
    freopen("schlnet.in", "r", stdin);
    freopen("schlnet.out", "w", stdout);
    init();
    solve();
    return 0;
}


Altium Designer铺铜陷阱:为什么你的死铜总是清除不干净? 本文深入探讨Altium Designer中铺铜操作导致死铜无法清除的常见问题,分析死铜形成的五大诱因,并提供高级参数优化和网络连接性验证技巧。通过调整边界计算精度和泪滴算法设置,有效解决死铜残留问题,提升PCB设计质量与制造良率。 阅读详情

相关推荐

Ubuntu20.04安装Eigen3.3.7、模板类Sophus和Ceres

Sophus的使用必须依赖3.3以上的Eigen版本。如果版本太低,Sophus库将无法安装使用。

qq_62964142的博客 3422

Special topic 2

A - Network of Schools POJ - 1236 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 di...

Hugokung的博客 273

快速玩转 Llama2!机器学习 PAI 最佳实践(一)—低代码 Lora 微调及部署

本实践将采用阿里云机器学习平台PAI-快速开始模块针对 Llama-2-7b-chat 进行开发。PAI-快速开始支持基于开源模型的低代码训练、布署和推理全流程,适合想要快速开箱体验预训练模型的开发者。

阿里云云栖号 1766

Network of Schools POJ - 1236 (强连通分量)

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

alex1997222的博客 292

MemSeg:一种差异和共性来检测图像表面缺陷的半监督方法

本文认为人为创建类内差异和保持类内共性可以帮助模型实现更好的缺陷检测能力,从而更好地区分非正常图像。如图一所示。差异(differences):MemSeg引入人工模拟的异常图像在训练阶段使模型能够区分正常和异常的图像,减轻了半监督学习只能用正常样本进行训练的不足,然后在推理阶段可以直接输入图像无需做任何后处理。共性(commonalities):MemSeg引入了一个记忆池来记录正常样本的通用模式,在训练和推理阶段,比较输入图像和记忆池中的样本之间的差异,为异常区域的定位提供有用的信息。

斯人若彩虹,遇上方知有! 4839

银河麒麟系统下VSCode安装全攻略:从下载到桌面快捷方式(附常见问题解决)

本文详细介绍了在银河麒麟系统下安装和优化VSCode的全流程,包括环境准备、安装策略、权限管理、桌面快捷方式创建以及系统级性能调优。特别针对国产系统环境提供了常见问题解决方案和必备插件推荐,帮助开发者高效配置开发环境。

v6b7n8m9q0的博客 1133

Pku1236 Network of Schools

Pku1236 Network of Schools 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

lty26319的博客 431

【基于深度学习的脑电图识别】数据集篇:THE TUH EEG CORPUS: A Big Data Resource for Automated EEG Interpretation

【基于机器学习的脑电图识别】数据集篇:脑电信号自动判读的大数据摘要: 摘要: 这个数据集包括超过 25000 个脑电图研究,包括一个神经学家对测试的解释,一个简短的病人病史和关于病人的人口统计信息,如性别和年龄。这是第一次有足够的数据来支持最先进的机器学习算法的应用。在这篇论文中,我们使用了3762个语料库的会话子集,展示了从原始脑电图信号数据预测脑电图的一些基本属性的初步实验结果。在闭环测试中,...

梁瑛平的博客 5615

Network of Schools POJ - 1236(塔尖算法的入门)

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

weixin_45177251的博客 549

IGBT基础知识及应用电路仿真(Multisim)

本文系统介绍了IGBT(绝缘栅双极晶体管)及其应用电路。首先详细解析了IGBT的基本结构、工作原理和特性参数,重点阐述了其五层半导体结构、电导调制效应和电压驱动特性。随后通过Multisim仿真展示了IGBT在四种典型功率变换电路中的应用:半桥驱动电路实现隔离式互补驱动;全桥逆变电路完成DC-AC转换;三相桥式逆变电路生成三相交流电;直流斩波电路(BUCK/BOOST/BUCK-BOOST)实现电压升降变换。文章通过理论分析与仿真波形相结合,全面呈现了IGBT在中高压大功率场景下的优异性能和灵活应用。

XU157303764的博客 1217

AI 赋能 DBA:如何用 DeepSeek 等大模型简化数据库管理工作

数据库管理员(DBA)的工作涉及 SQL 优化、故障排查、性能监控等复杂任务。而 DeepSeek、ChatGPT 等大模型可以大幅减少重复劳动,提高 DBA 的工作效率。:某电商平台的订单查询 SQL 执行缓慢(平均 5s),DBA 需要优化。:DBA 需要监控 MySQL 的慢查询,但不想手动写脚本。:某金融系统频繁出现数据库死锁,DBA 需要快速定位原因。:大模型可分析 SQL 执行计划,推荐索引优化方案。:用日常语言查询数据库,无需写复杂 SQL。:一键生成监控、备份、数据迁移脚本。

专注于编程、AI、人工智能等多个领域内容研究和分析 564

poj 1236强联通+缩点应用

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 (th

winycg的博客 599

L型探测器几何畸变矫正

定位像素空间位置 -> 计算水平面投影点 -> 统一物理分辨率 -> 重采样生成新图。

如果想成为中心,那么就到中心去吧。 241

【USACO5.3.3】Network of Schools

nkoj 1862 Description 一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中。  你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务 A)。更进一步,我们想要确定通过给任意一个学校发送新软件

INCINCIBLE的博客 709

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

[USACO5.3]校园网Network of Schools

https://www.luogu.org/problemnew/show/P2746 缩点以后,可以保证图里没有环,只有链。由于不存在环,每条链必然存在一个唯一的入度为0的点。显然,对于每条链,只需要将软件发给这个入度为0的点,就可以间接传给这条链上所有的点。因此,任务A就转化为了求缩点后的图中有多少个点入度为0。 下面来看任务B。我们发现,图中只要存在入度为0的点和出度为0的点就永远不可能满足...

NOIP提高组日志 169

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

USACO 5.3 Network of Schools

tarjan标准题。 直接tarjan即可。 思考一个问题:添加多少个边让图变为连通图。   Test 1: TEST OK [0.003 secs, 3512 KB] Test 2: TEST OK [0.003 secs, 3380 KB] Test 3: TEST OK [0.003 secs, 3512 KB] Test 4: TEST OK [0.005

ACMer不要报考高校代码为13627的移通学院! 512

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

P2746 [USACO5.3]校园网Network of Schools

题目描述 一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中。 你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务 A)。更进一步,我们想要确定通过给任意一个学校发送新软件,这个软件就会分发到网络中的所有学校。...

LanQiLi的博客 366

USACO Training 5.3.3 Network of Schools 校园网 题解与分析

Network of Schools 校园网 IOI '96 Day 1 Problem 3 描述 一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中。 你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目

初学者 1083

C++——【USACO 5.3.3】——Network of Schools

Network of Schools IOI '96 Day 1 Problem 3 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 w

McDonnell_Douglas的博客 715

luogu2746 [USACO5.3]校园网Network of Schools

题目 题目描述 一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中。 你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务 A)。更进一步,我们想要确定通过给任意一个学校发送新软件,这个软件就会分...

banlianbi6499的博客 579

[IOI 1996 / USACO5.3] Network of Schools

摘要 本文解决了一个关于学校软件分发的问题。给定各学校间的单向软件分享关系,需要回答:1)至少向多少学校分发软件才能使所有学校获得软件;2)最少需要增加多少分享关系才能实现仅向任意一个学校分发一次就能覆盖所有学校。 解法首先使用Tarjan算法将学校网络缩点为强连通分量。对于问题1,答案即为入度为0的强连通分量数量。对于问题2,当强连通分量数大于1时,答案等于入度为0和出度为0的强连通分量数的最大值;否则答案为0。代码实现了上述算法,时间复杂度主要由Tarjan算法决定。

bz_2023f33的博客 994

【题解】洛谷P2746 [USACO5.3]校园网Network of Schools(tarjan)

你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务A)。注意即使B在A学校的分发列表中,A也不一定在B学校的列表中。对于题目,我们只需要给一个起点,也就是无法从其他学校获取新软件的学校,必须给他发,从而我们可以得知,该点入度为0,那么对于子任务A,也就是。接下来N行中每行都表示一个接收学校列表(分发列表),第i+1行包括学校i的接收学校的标识符。若有错误之处,欢迎指正,啦啦啦啦啦啦啦啦~~~~~~~~~~~~~~~.........

qq_61153735的博客 351
上一篇: usaco5.3.2 Window Area
下一篇: usaco5.3.4 Big Barn
max_kibble
博客等级 码龄11年 2粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值