题2.pta数据结构题集-File Transfer (25分)
文章目录
- 题2.pta数据结构题集-File Transfer (25分)
- 一、题目
- 二、题解
- 1.简析
- 2.代码
题2.pta数据结构题集-File Transfer (25分)
一、题目
二、题解
1.简析
并查集的常规题。由于这里电脑的编号是从1到N,所以不妨将一个数组下标当作电脑编号,对应的数组元素直接就是该编号电脑的父电脑编号,若该编号电脑为根电脑,则用一个负数表示它的父电脑,它的绝对值就是这棵树拥有的节点个数(用于按秩归并)。然后按并查集的find,union写就好。
2.代码
下面是第一次做敲的码,未用路径压缩
#include <stdio.h>
#include <stdlib.h>#define Maxsize 100000void finish_connect(int set[])//连接操作
{int c1,c2;int root1,root2;scanf("%d%d",&c1,&c2);root1=find_root(c1,set);//找寻c1,c2的根电脑root2=find_root(c2,set);if(root1==root2)//根电脑相同无需连接{return;}else{union_set(root1,root2,set);//通过连接c1,c2的根电脑连接c1,c2}return;
}int check_connect(int set[])//检查两台电脑
{int c1,c2;int root1,root2;scanf("%d%d",&c1,&c2);root1=find_root(c1,set);root2=find_root(c2,set);if(root1==root2)//根电脑相同说明c1,c2连接{return 1;}else{return 0;}
}void Check(int set[],int N)//检查所有电脑
{int i;int k=0;//用k记录根电脑的个数for(i=1;i<=N;i++){if(set[i]<0)//set值为负数时方为根电脑{k++;}}if(k==1)//当只有一台根电脑时网络全部连通{printf("The network is connected.");}else{printf("There are %d components.",k);}return;
}int find_root(int c,int set[])
{int root;for(;set[c]>=0;c=set[c]);root=c;return root;
}void union_set(int root1,int root2,int set[])//按秩归并(大树接上小树)连接电脑
{//将set[root]设为单个集合元素个数的相反数,从而储存了树的规模if(set[root1]<set[root2])//root1为大树(注意:由于是负数比大小,所以越小规模越大){set[root1]+=set[root2];//root1树接上root2树,元素个数增加为两树之和set[root2]=root1;//将root2树奉root1树为根}else{set[root2]+=set[root1];set[root1]=root2;}return;
}int main()
{int N;int i;char key;int set[Maxsize];//由于电脑是按顺序编号所以直接利用数组下标表示电脑,进而用set[]表示该电脑的上头为哪个电脑int answer[Maxsize];//储存C的答案for(i=0;i<Maxsize;i++){answer[i]=-1;}scanf("%d",&N);for(i=1;i<=N;i++)//用-1初始化所有电脑,表示都不连通{set[i]=-1;}i=0;do{key=getchar();switch(key){case 'I':finish_connect(set);break;case 'C':answer[i]=check_connect(set);i++;break;}}while(key!='S');for(i=0;answer[i]!=-1;i++){if(answer[i]==1){printf("yes\n");}else{printf("no\n");}}Check(set,N);return 0;
}
第二次做敲的码,这个用路径压缩了
#include <bits/stdc++.h>using namespace std;int parent[10001];void init()
{fill(parent,parent+10001,-1);return;
}int find_root(int v)
{if(parent[v]<0){return v;}else{return parent[v]=find_root(parent[v]);//路径压缩,会将路径上的节点的父节点都变成根节点,相当于直接将这些节点贴在了根节点上,大大缩短了下一次find的路径}
}int check_set(int v1,int v2)
{int root1,root2;root1=find_root(v1);root2=find_root(v2);if(root1!=root2){return 0;}else{return 1;}
}void union_set(int v1,int v2)
{int root1,root2;root1=find_root(v1);root2=find_root(v2);if(root1==root2){return;}if(parent[root1]<parent[root2]){parent[root1]+=parent[root2];parent[root2]=root1;}else{parent[root2]+=parent[root1];parent[root1]=root2;}return;
}int count_set(int N)
{int num=0;for(int i=1;i<=N;i++){if(parent[i]<0){num++;}}return num;
}int main()
{init();int N;cin>>N;char op;cin>>op;while(op!='S'){int v1,v2;cin>>v1>>v2;switch(op){case 'C':if(check_set(v1,v2)){printf("yes\n");}else{printf("no\n");}break;case 'I':union_set(v1,v2);break;}cin>>op;}int num=count_set(N);if(num>1){printf("There are %d components.\n",num);}else{printf("The network is connected.\n");}
}
题2.pta数据结构题集-File Transfer (25分)相关推荐
- MOOC浙大数据结构课后题记录——PTA数据结构题目集(全)
目录 第一周--最大子列和算法.二分查找 01-复杂度1 最大子列和问题 (20分) 01-复杂度2 Maximum Subsequence Sum (25分) 01-复杂度3 二分查找 (20分) ...
- 拼题A (PTA) 公共题集题解收录
仓库地址:PTA: 拼题A(PTA)公共题集的题解 (github.com) 该仓库收录 拼题A 公共习题的题解,绝大部分习题都是本人自己的原创代码,如有错误的代码可提交 Issue 推荐使用我开发的 ...
- PTA数据结构题目集 第十一周——散列查找
目录 11-散列1 电话聊天狂人 (25分) 思路 代码 测试点 11-散列2 Hashing (25分) 思路 代码 测试点 11-散列3 QQ帐户的申请与登陆 (25分) 题目大意 思路 代码 测 ...
- C++学习之路 | PTA乙级—— 1010 一元多项式求导 (25分)(精简)
1010 一元多项式求导 (25分) 设计函数求一元多项式的导数.(注:x n (n为整数)的一阶导数为nx n−1 .) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值 ...
- PTA 多项式A除以B (25 分)
7-10 多项式A除以B (25 分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出一 ...
- C++学习之路 | PTA乙级—— 1075 链表元素分类 (25 分)(精简)
1075 链表元素分类 (25 分) 给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面.但每一类内部元 ...
- C++学习之路 | PTA乙级—— 1035 插入与归并 (25 分)(精简)
1035 插入与归并 (25 分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直 ...
- 数据结构排序-7-3 点赞狂魔 (25 分)
7-3 点赞狂魔 (25 分) 微博上有个"点赞"功能,你可以为你喜欢的博文点个赞表示支持.每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性.然而有这么 ...
- PTA 7-14 电话聊天狂人(25 分)map的应用
7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤105),为通话记录条数.随后N行,每行给出一条通话记录.简单 ...
- PTA 用扑克牌计算24点 (25 分)
一副扑克牌的每张牌表示一个数(J.Q.K 分别表示 11.12.13,两个司令都表示 6).任取4 张牌,即得到 4 个 1~13 的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个 ...
最新文章
- python 通过双栈实现队列
- python拷贝linux文件到windows_windows python文件拷贝到linux上执行问题
- 鸿蒙内核源码分析:调度机制篇
- cd返回上一 git_PHP项目中应用CI/CD的碎碎恋!
- java实现扫地agent_如何实现java agent?分享java agent的使用案例
- 通过jQuery把数据库里面的数据进行增删查改
- 当OpenOrg和OpenGov发生冲突时
- C语言结构体内存对齐问题
- asp.net 中的几种计时器
- 遍历数组是什么意思_漫画:寻找无序数组的第k大元素(修订版)
- python networkx教程_Python社交网络——NetworkX入门
- 日本最后一刻阻拦鸿海收购夏普:质疑董事私心
- 数据中心运维管理经验39条
- 耗时162天,从华为外包5k转岗正式员工15k,经历的心酸只有自己知道
- js判断数组中重复元素并找出_JS判断数组里是否有重复元素的方法小结
- H.264之lookahead
- 如何清除/删除最近的文档历史记录?
- 网易微专业python爬虫工程师一期多久_有木有人上过网易云课堂的 Python Web 微专业,怎么样?...
- Apache Pulsar PMC 成员翟佳:开源和 Apache 社区是个带有魔法的宝库
- 本人写的一个傲娇的语句
热门文章
- 【机器学习Machine Learning】资料大全
- 用单片机控制直流电机
- 计算机应用excel题,计算机应用操作练习题-Excel
- Android Launcher 应用开发
- mysql学生管理系统背景_MySql学习之路1 背景介绍
- wpsppt流程图联系效果_wps幻灯片怎么制作流程图
- dbc数据库 与 mysql_【图片】DBC2000安装及数据库详细解析(不断更行中......)【dbc2000吧】_百度贴吧...
- 机械设计基础课程设计详细步骤(说明书)
- HTML5期末大作业:基于 html css js仿腾讯课堂首页
- wordpress建立数据库连接时出错