文章目录

  • 题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分)相关推荐

  1. MOOC浙大数据结构课后题记录——PTA数据结构题目集(全)

    目录 第一周--最大子列和算法.二分查找 01-复杂度1 最大子列和问题 (20分) 01-复杂度2 Maximum Subsequence Sum (25分) 01-复杂度3 二分查找 (20分) ...

  2. 拼题A (PTA) 公共题集题解收录

    仓库地址:PTA: 拼题A(PTA)公共题集的题解 (github.com) 该仓库收录 拼题A 公共习题的题解,绝大部分习题都是本人自己的原创代码,如有错误的代码可提交 Issue 推荐使用我开发的 ...

  3. PTA数据结构题目集 第十一周——散列查找

    目录 11-散列1 电话聊天狂人 (25分) 思路 代码 测试点 11-散列2 Hashing (25分) 思路 代码 测试点 11-散列3 QQ帐户的申请与登陆 (25分) 题目大意 思路 代码 测 ...

  4. C++学习之路 | PTA乙级—— 1010 一元多项式求导 (25分)(精简)

    1010 一元多项式求导 (25分) 设计函数求一元多项式的导数.(注:x ​n ​​ (n为整数)的一阶导数为nx ​n−1 ​​ .) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值 ...

  5. PTA 多项式A除以B (25 分)

    7-10 多项式A除以B (25 分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出一 ...

  6. C++学习之路 | PTA乙级—— 1075 链表元素分类 (25 分)(精简)

    1075 链表元素分类 (25 分) 给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面.但每一类内部元 ...

  7. C++学习之路 | PTA乙级—— 1035 插入与归并 (25 分)(精简)

    1035 插入与归并 (25 分) 根据维基百科的定义: 插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列.每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置.如此迭代直 ...

  8. 数据结构排序-7-3 点赞狂魔 (25 分)

    7-3 点赞狂魔 (25 分) 微博上有个"点赞"功能,你可以为你喜欢的博文点个赞表示支持.每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性.然而有这么 ...

  9. PTA 7-14 电话聊天狂人(25 分)map的应用

    7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条数.随后N行,每行给出一条通话记录.简单 ...

  10. PTA 用扑克牌计算24点 (25 分)

    一副扑克牌的每张牌表示一个数(J.Q.K 分别表示 11.12.13,两个司令都表示 6).任取4 张牌,即得到 4 个 1~13 的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个 ...

最新文章

  1. python 通过双栈实现队列
  2. python拷贝linux文件到windows_windows python文件拷贝到linux上执行问题
  3. 鸿蒙内核源码分析:调度机制篇
  4. cd返回上一 git_PHP项目中应用CI/CD的碎碎恋!
  5. java实现扫地agent_如何实现java agent?分享java agent的使用案例
  6. 通过jQuery把数据库里面的数据进行增删查改
  7. 当OpenOrg和OpenGov发生冲突时
  8. C语言结构体内存对齐问题
  9. asp.net 中的几种计时器
  10. 遍历数组是什么意思_漫画:寻找无序数组的第k大元素(修订版)
  11. python networkx教程_Python社交网络——NetworkX入门
  12. 日本最后一刻阻拦鸿海收购夏普:质疑董事私心
  13. 数据中心运维管理经验39条
  14. 耗时162天,从华为外包5k转岗正式员工15k,经历的心酸只有自己知道
  15. js判断数组中重复元素并找出_JS判断数组里是否有重复元素的方法小结
  16. H.264之lookahead
  17. 如何清除/删除最近的文档历史记录?
  18. 网易微专业python爬虫工程师一期多久_有木有人上过网易云课堂的 Python Web 微专业,怎么样?...
  19. Apache Pulsar PMC 成员翟佳:开源和 Apache 社区是个带有魔法的宝库
  20. 本人写的一个傲娇的语句

热门文章

  1. 【机器学习Machine Learning】资料大全
  2. 用单片机控制直流电机
  3. 计算机应用excel题,计算机应用操作练习题-Excel
  4. Android Launcher 应用开发
  5. mysql学生管理系统背景_MySql学习之路1 背景介绍
  6. wpsppt流程图联系效果_wps幻灯片怎么制作流程图
  7. dbc数据库 与 mysql_【图片】DBC2000安装及数据库详细解析(不断更行中......)【dbc2000吧】_百度贴吧...
  8. 机械设计基础课程设计详细步骤(说明书)
  9. HTML5期末大作业:基于 html css js仿腾讯课堂首页
  10. wordpress建立数据库连接时出错