摘要:
题目传送:HDOJ 1233解题思路:Kruskal算法,利用Kruskal算法获得最小生成树,即可求得答案。数据结构:记录下起始坐标,结束坐标,两点距离和该路是否被选中这四个信息。View Code struct EDGE{ int x;//起始坐标 int y;//结束坐标 int len;//距离 int fg;//标记是否被选中}过程: 1、读取所有路径信息,保存在上述数据结构的数组中; 2、快速排序,使得数组中的数据结构按路径长度从小到大排列; 3、优先选择路径较短的建树,此处为for循环; 4、建树过程中,利用并查集判断该路是否会产生回路,如... 阅读全文
摘要:
题目传送:HDOJ 1232 畅通工程解题思路:本题可以理解为一张无向图中给定部分连通分量,求多条连通分量间,需要至少多少条连线可以使图变为一条连通分量。对于无向图求连通分量个数问题,可以采用并查集的方法解决。并查集:一种树形结构,常用于处理不相交集合的合并和查询问题。相关链接:数据结构之并查集本题代码:#include <stdio.h>int father[1010];int findFather(int a)//寻找结点的祖父结点{ while(father[a]!=a) a=father[a]; return a;}void merge(int x, int ... 阅读全文
摘要:
题目传送:HDOJ 1205解题思路:保证最大堆和次大堆间的糖果数量之差小于等于1。假设最大堆为Smax,次大堆为Ssub,总糖果树为SUM,则Smax-Ssub<=SUM-Smax-Ssub-1,即2Smax-SUM<=1。本题代码:#include <stdio.h>int main(){ int t; int n,max,temp,i; long long sum; scanf("%d", &t); while(t--) { max=0; sum=0; scanf("%d", &n); for(i... 阅读全文