数据结构第二天:File Transfer 【树的应用:集合】

news2024/11/29 2:46:08

原题是英文的:题目详情 - 05-树8 File Transfer (pintia.cn)

我用软件翻译了一下:

我们有一个计算机网络和一系列双向连接。这些连接中的每一个都允许文件从一台计算机传输到另一台计算机。有没有可能从网络上的任何一台计算机向其他计算机发送文件?

Input Specification:

每个输入文件包含一个测试用例。对于每个测试用例,第一行包含N(2≤N≤10)4),网络中计算机的总数。然后,网络中的每台计算机都用1n之间的正整数表示。然后,在下面的行中,输入以如下格式给出:

I c1 c2 

其中I表示输入c1c2之间的联系;

C c1 c2   

其中C表示检查是否可以在c1c2之间传输文件;

S

S代表停止这种情况。

Output Specification:

对于每个C情况,如果可能或不可能在c1c2之间传输文件,分别在一行中打印单词“yes”“no”。在每个案例的末尾,如果有任何一对计算机之间的路径,打印一行网络已连接”;或者k个组件,其中k是这个网络中连接组件的数量

按照课件说的我将代码写完

#include <iostream>

using namespace std;
int map[10010];

//通过根的连接,将两个集合合并 
void link(int a,int b){
      map[b] = a;
}

//找到a的根 
int find(int a){
	for( ; map[a]>0 ; a=map[a]);
     return a;	
}

//将两个节点合并为同一个集合中
void connection(int a,int b){
	int aroot,broot;
	aroot = find(a);
	broot = find(b);
	if(aroot != broot){
		link(aroot,broot); 
	}
}

//两个节点是否连接 
void is_connection(int a,int b){
	int aroot,broot;
	aroot = find(a);
	broot = find(b);
	if(aroot != broot){
		cout<<"no"<<endl;
		return;
	}
	cout<<"yes"<<endl;
	return;
}

//判断这些电脑有多少个区域 
void check_components(int n){
	int check_int = 0;
	for(int i=1;i<=n;i++){
		if(map[i] == -1) check_int++;
	}
	if(check_int>1){
		printf("There are %d components.",check_int);
		return;
	}
	printf("The network is connected.");
	return;
} 

int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) map[i] = -1;
	char ch;
	int a,b;
	while(1){
		cin>>ch;
		if(ch=='S') break;
		scanf("%d %d\n",&a,&b);
		if(ch=='C'){
			is_connection(a,b);
		}
		if(ch=='I'){
			connection(a,b);
		}
	}
	check_components(n); 
	return 0;
}


 提交上去结果超时了

 又看了一遍课件,突然发现自己连接根节点的函数只考虑了我们需要通过连接两个节点的根节点来减少这个树的高度,但是忽略了一件事情,就是高树接到低树上还是会增加树的高度,但是如果是低树接到高树的话,并不会增加树的高度,树的高度小了,我们find函数所进行的循环次数也就变少了,那么我们时间也就变少了。所以我将link函数稍微修改了一下,如果是同高的话,那么哪棵树连哪棵树都可以。如下:

void link(int a,int b){
      if(map[a] < map[b]){
          map[b] = a;
      }else{
          if(map[a] == map[b])  map[b]--;
          map[a] = b;
      }
    return;
}

画个图更加容易理解:

改完代码整体如下:

#include <iostream>

using namespace std;
int map[10010];

//通过根的连接,将两个集合合并 
void link(int a,int b){
      if(map[a] < map[b]){
          map[b] = a;
      }else{
          if(map[a] == map[b])  map[b]--;
          map[a] = b;
      }
    return;
}

//找到a的根 
int find(int a){
	for( ; map[a]>0 ; a=map[a]);
     return a;	
}

//将两个节点合并为同一个集合中
void connection(int a,int b){
	int aroot,broot;
	aroot = find(a);
	broot = find(b);
	if(aroot != broot){
		link(aroot,broot); 
	}
}

//两个节点是否连接 
void is_connection(int a,int b){
	int aroot,broot;
	aroot = find(a);
	broot = find(b);
	if(aroot != broot){
		cout<<"no"<<endl;
		return;
	}
	cout<<"yes"<<endl;
	return;
}

//判断这些电脑有多少个区域 
void check_components(int n){
	int check_int = 0;
	for(int i=1;i<=n;i++){
		if(map[i] < 0) check_int++;
	}
	if(check_int>1){
		printf("There are %d components.",check_int);
		return;
	}
	printf("The network is connected.");
	return;
} 

int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) map[i] = -1;
	char ch;
	int a,b;
	while(1){
		cin>>ch;
		if(ch=='S') break;
		scanf("%d %d\n",&a,&b);
		if(ch=='C'){
			is_connection(a,b);
		}
		if(ch=='I'){
			connection(a,b);
		}
	}
	check_components(n); 
	return 0;
}


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

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

相关文章

STM32 学习笔记_7 定时器中断:输出比较

输出比较 电机相关比较重要。 OC Output Compare&#xff08;IC 是输入捕获&#xff0c;CC代指这两个单元&#xff09;&#xff0c;用于输出一定频率和占空比的PWM波形。 右下角四个就是CCR。只有通用计时器和高级计时器有&#xff0c;共用一个cnt计数器&#xff0c;高级计数…

(数字图像处理MATLAB+Python)第七章图像锐化-第四节:频域高通滤波与综合案例

文章目录 一&#xff1a;频域高通滤波&#xff08;1&#xff09;理想的高通滤波器&#xff08;2&#xff09;巴特沃斯高通滤波器&#xff08;3&#xff09;指数高通滤波器&#xff08;4&#xff09;梯形高通滤波器 二&#xff1a;综合案例——人像美化&#xff08;1&#xff09…

C语言函数大全-- w 开头的函数(2)

C语言函数大全 本篇介绍C语言函数大全-- w 开头的函数 1. wcstok 1.1 函数说明 函数声明函数功能wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim, wchar_t **ptr);用于将一个长字符串拆分成几个短字符串&#xff08;标记&#xff09;&#xff0c;并返回第一个标记的地…

非煤矿山电子封条建设算法 yolov8

非煤矿山电子封条建设算法模型通过yolov8网络模型AI视频智能分析技术&#xff0c;算法模型对作业状态以及出井入井人员数量变化、人员睡岗离岗等情况实时监测分析&#xff0c;及时发现异常动态&#xff0c;自动推送生成的违规截图报警信息。现代目标检测器大部分都会在正负样本…

免费下载Sketch模板素材一文搞定!

对于设计师来说&#xff0c;UI 模板素材是提高设计效率和保证设计质量的重要工具。然而&#xff0c;很多设计师在使用 Sketch 时&#xff0c;会遇到 Sketch 模板素材不足、格式不兼容或使用成本高等问题。本文将为你介绍一款资源齐全、跨平台、无需下载、免费使用的 Sketch 模板…

Tips for Deep Learning

目录 Recipe of Deep Learning Good Results on Training Data&#xff1f; New activation function Adaptive learning rate Good Results on Testing Data&#xff1f; Early Stopping Regularization Dropout Recipe of Deep Learning 我们要做的第一件事是&#x…

http协议在万维网的一生

tcp与udp的区别 http协议位于应用程序层&#xff0c;必须经过传输层进行通信 tcp即传输控制协议&#xff0c;首先通过三次握手建立连接&#xff0c;然后传输数据&#xff0c;数据传输成功后 通过四次挥手关闭连接&#xff0c;如有数据丢失则会重试保证数据传输可靠性 是一个面向…

树的前中后序以及广度优先搜索和深度优先搜索

文章目录 基本概念定义一棵树前序遍历中序遍历后序遍历BFS广度优先遍历DFS深度优先遍历 基本概念 树是一个有n个有限节点组成一个具有层次关系的集合&#xff0c;每个节点有0个或者多个子节点&#xff0c;没有父节点的节点称为根节点&#xff0c;也就是说除了根节点以外每个节…

TS38.331中need -M/R/N/S 的含义

need M&#xff1a;这种字段需要UE在不存在时维护&#xff1b;need R&#xff1a;当RRC中此字段不存在时&#xff0c;UE需要释放&#xff1b;need N&#xff1a;当此字段不存在时&#xff0c;UE不需要采取任何行动&#xff08;即UE不需要保持该字段的任何现有值&#xff09;&am…

如何使用单片机点亮LED灯,并使用按键控制[51单片机]

首先先看一下我的板子&#xff0c;如果我们板子不相同&#xff0c;可能操作也不太相同 我们就不讲底层原理了&#xff0c;直接看&#xff0c;我们可以看到板子上有 8个LED灯 那这个8个LED用什么来控制呢&#xff0c;我们先看底层的线路图&#xff0c;所有的LEDD都连接到了P2带后…

云原生技术中的容器技术有哪些?

文章目录 云原生技术中的容器技术有哪些1、云原生的含义2、容器的含义3、云原生的技术的基石&#xff1a;容器技术4、容器技术有哪些? 结语 云原生技术中的容器技术有哪些 在现今的安全行业中云原生安全技术中的容器安全技术有哪些呢&#xff0c;很多用户都不知道具体的含义以…

Linux程序设计之UDP通信

1.UDP通信是不可靠的、无连接的通信&#xff0c;客户端只需要服务器端的地址信息即可与之进行通信。UDP通信的基本流程如下&#xff1a; 2.利用UDP实现服务器端与客户端的通信如下&#xff1a; /*UDP通信*/ //服务端#include <stdio.h> #include <string.h> #incl…

低造价形状记忆合金相变温度DSC热分析替代技术:帕尔贴热电装置和电阻温度测量

摘要&#xff1a;形状记忆合金&#xff08;SMA&#xff09;是一种先进的金属材料&#xff0c;其物理和机械性能本质上依赖于温度。为了快速和低成本的实现SMA相变温度和热滞后性能的测试表征&#xff0c;基于更灵敏的电阻温度依赖关系&#xff0c;本文提出了采用帕尔贴TEC加热制…

论文学习笔记:ViT Vision Transformer An Image is worth 16X16 words

论文阅读&#xff1a;ViT Vision Transformer An Image is worth 16X16 words 今天介绍的是 Transformer 在视觉领域的一篇非常重要的论文&#xff0c;Vision Transformer&#xff0c;这篇文章发表在 2021 ICLR 的会议上。长久以来 CNN 一直是 CV 领域最主流的模型&#xff0c…

从零开始:开发一款应用程序的完整流程技巧

在数字化快速发展的现在&#xff0c;开发一款应用程序已经不是一件困难的事情。低代码应用开发平台的诞生更是让应用开发变成一项人人都能快速掌握的技能。之前&#xff0c;我们使用Java、C语言等传统的语言技术进行应用开发&#xff0c;来满足企业的业务应用需求。但是&#x…

rm / -rf指令的作用是?

学习Linux 指令&#xff0c;它是操作系统的前端&#xff0c;学好这部分内容一方面可以帮助你应对工作场景&#xff0c;另一方面可以让你在学习操作系统底层知识前&#xff0c;对 Linux 有一个大概的了解。 学习 Linux 指令之前&#xff0c;先来说一下什么是 Shell&#xff1f;S…

使用FFMPEG加载外挂字幕小记

ffmpeg版本&#xff1a; FFMEPEG 4.4 继上一篇简易播放器实现后&#xff0c;优化过程中&#xff0c;加载外挂字幕小记的过程和遇到的坑记录如下&#xff1a; 视频字幕分为三种。 内嵌字幕&#xff0c;字幕与视频图像合二为一&#xff0c;成为视频帧的一部分。 内封字幕&…

Python浪漫520表白代码

目录 前言 表白界面 跳动的爱心 漂浮的爱心 满屏表白代码 前言 520是每年的5月20日&#xff0c;因数字“520”与“我爱你”发音相似而被许多年轻人用作表达爱意的节日。这个节日起源于中国互联网文化&#xff0c;逐渐传递到其他国家和地区。在这一天&#xff0c;情侣们通…

C++:深入理解C++11新特性:Chapter3:左值和右值

Chapter3&#xff1a;左值和右值 1. 将右值绑定到 左值2. 将右值绑定到 常量左值引用3. 将右值绑定到右值引用总结&#xff1a;5. 左值&#xff0c;右值和右值引用6. 引用类型可以引用的值 在C语言中&#xff0c;我们常常会提起左值&#xff08;lvalue&#xff09;,右值&#x…

数组--part 5--螺旋矩阵(力扣59/54)(剑指offer 29)

文章目录 基本算法思想leetcode 59 螺旋矩阵 IIleetcode 54 螺旋矩阵剑指Offer 29 顺时针打印矩阵 基本算法思想 建议先去把题目看了&#xff0c;再来思考相关的代码。 错误的想法&#xff1a;实际上这种题型并不存在算法&#xff0c;只涉及到模拟&#xff0c;但是模拟难度并…