题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162
Problem Description:
Eddy begins to like painting pictures recently ,he is sure of himself to become a painter.Every day Eddy draws pictures in his small room, and he usually puts out his newest pictures to let his friends appreciate. but the result it can be imagined, the friends are not interested in his picture.Eddy feels very puzzled,in order to change all friends 's view to his technical of painting pictures ,so Eddy creates a problem for the his friends of you.
Problem descriptions as follows: Given you some coordinates pionts on a drawing paper, every point links with the ink with the straight line, causes all points finally to link in the same place. How many distants does your duty discover the shortest length which the ink draws?
Input:
The first line contains 0 < n <= 100, the number of point. For each point, a line follows; each following line contains two real numbers indicating the (x,y) coordinates of the point.
Input contains multiple test cases. Process to the end of file.
Output:
Your program prints a single real number to two decimal places: the minimum total length of ink lines that can connect all the points.
Sample Input
3
1.0 1.0
2.0 2.0
2.0 4.0
Sample Output
3.41
AC代码····
***************************************************
#include"stdio.h"
#include"math.h"
#include"string.h"
#define MAX 11111111
double map[101][101],x[101],y[101];
int n,father[101];
void Make_map()
{
int i,j;
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
{
if(i==j)
map[i][j]=MAX;
else
map[i][j]=map[j][i]=sqrt((x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i]));
}
}
void Make_father()
{
int i;
for(i=1;i<=n;i++)
father[i]=i;
}
int find(int x)
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
void Union(int x,int y)
{
int i;
x=find(x);
y=find(y);
if(x!=y)
{
for(i=1;i<=n;i++)
if(father[i]==y)
father[i]=x;
father[y]=x;
}
}
int main()
{
int i,j,k,a,b;
double min,sum;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
Make_map();
Make_father(n);
sum=0;
for(k=1;k<=n;k++)
{
min=MAX;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if(map[i][j]<min&&father[i]!=father[j])
{
min=map[i][j];
a=i;
b=j;
}
}
}
if(father[a]!=father[b])
{
sum+=map[a][b];
Union(a,b);
map[a][b]=map[b][a]=MAX;
}
}
printf("%.2lf\n",sum);
}
return 0;
}
Problem Description:
Eddy begins to like painting pictures recently ,he is sure of himself to become a painter.Every day Eddy draws pictures in his small room, and he usually puts out his newest pictures to let his friends appreciate. but the result it can be imagined, the friends are not interested in his picture.Eddy feels very puzzled,in order to change all friends 's view to his technical of painting pictures ,so Eddy creates a problem for the his friends of you.
Problem descriptions as follows: Given you some coordinates pionts on a drawing paper, every point links with the ink with the straight line, causes all points finally to link in the same place. How many distants does your duty discover the shortest length which the ink draws?
Input:
The first line contains 0 < n <= 100, the number of point. For each point, a line follows; each following line contains two real numbers indicating the (x,y) coordinates of the point.
Input contains multiple test cases. Process to the end of file.
Output:
Your program prints a single real number to two decimal places: the minimum total length of ink lines that can connect all the points.
Sample Input
3
1.0 1.0
2.0 2.0
2.0 4.0
Sample Output
3.41
AC代码····
***************************************************
#include"stdio.h"
#include"math.h"
#include"string.h"
#define MAX 11111111
double map[101][101],x[101],y[101];
int n,father[101];
void Make_map()
{
int i,j;
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
{
if(i==j)
map[i][j]=MAX;
else
map[i][j]=map[j][i]=sqrt((x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i]));
}
}
void Make_father()
{
int i;
for(i=1;i<=n;i++)
father[i]=i;
}
int find(int x)
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
void Union(int x,int y)
{
int i;
x=find(x);
y=find(y);
if(x!=y)
{
for(i=1;i<=n;i++)
if(father[i]==y)
father[i]=x;
father[y]=x;
}
}
int main()
{
int i,j,k,a,b;
double min,sum;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
Make_map();
Make_father(n);
sum=0;
for(k=1;k<=n;k++)
{
min=MAX;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if(map[i][j]<min&&father[i]!=father[j])
{
min=map[i][j];
a=i;
b=j;
}
}
}
if(father[a]!=father[b])
{
sum+=map[a][b];
Union(a,b);
map[a][b]=map[b][a]=MAX;
}
}
printf("%.2lf\n",sum);
}
return 0;
}
发表评论
-
杭电1596 迪杰特斯拉算法的应用
2012-07-25 20:47 1065题目 Problem Description XX星球有很多 ... -
杭电2680 迪杰特斯拉算法的应用
2012-07-25 20:43 1047题目描述: Problem Description: One ... -
杭电1272
2012-07-18 15:13 829这道题主要就是判断一下有没有环,还有就是节点数减去边数等于1, ... -
杭电2544 最短路径
2012-07-17 17:31 858Problem Description 在每年的校赛里,所有进 ... -
迪杰斯特拉(Dijkstra)算法
2012-07-17 16:07 1462迪杰斯特拉算法 迪杰斯特拉(Dijkstra)算法思想 ... -
杭电acm部分题目分类
2012-07-07 16:38 3424注:DP代表动态规划 1001 这个就不用说了吧 ... -
动态规划之背包问题
2012-07-07 16:22 840/*在一固定容积为C的背包内装入N件物品, 物品的体积为:w ... -
动态规划之背包问题
2012-07-07 16:12 0/*在一固定容积为C的背包内装入N件物品, 物品的体积为:w1 ... -
背包问题
2012-07-07 10:44 0决策是:第N件物品放或者不放; 由此可以写出动态转移方 ... -
杭电1003代码
2012-07-07 10:24 940#include<stdio.h> int mai ... -
动态规划
2012-07-07 10:21 749动态规划算法 一、基本 ...
相关推荐
图论模板 最小生成树,Kruscal算法,采用了并查集技术,外加注释,很通俗易懂的,可以用来解决acm 畅通工程方面的问题
本实习报告主要围绕“最小生成树”这一概念展开,结合杭电数据结构课程的实验要求,介绍了如何运用克鲁斯卡尔算法解决最小生成树问题。最小生成树问题常用于构建成本最低的网络,例如在 n 个城市间建立通信网络时,...
杭电ACM课件2014版之 (HDUACM201403版_06)并查集(最小生成树)
在这个实习报告中,我们将重点关注一个特定的数据结构问题——最小生成树。最小生成树(Minimum Spanning Tree, MST)是图论中的一个重要概念,特别是在网络设计、优化问题和算法分析中有着广泛的应用。 最小生成树是...
总的来说,这份杭电数据结构实验报告涵盖了数据结构的基础知识,通过实践操作,你将对约瑟夫环、排序算法、魔王语言和最小生成树有更深入的认识。这些知识不仅对学术研究有益,也是软件工程师必备的技能。不断探索和...
8. **最小生成树** - Prim算法适用于边稠密的图,时间复杂度为O(V^2)。 - Kruskal算法适用于边稀疏的图,时间复杂度为O(ElogE)。 9. **排序算法的时间复杂度** - 简单选择排序、堆排序、归并排序、基数排序在...
比如Prim算法构造最小生成树,Kruskal算法解决最小生成树问题等。 6. **回溯法与剪枝**:在解决搜索问题时,回溯法是一种常见的方法,如八皇后问题、N皇后问题等。通过剪枝可以减少无效搜索,提高效率。 7. **字符...
杭电数据结构最小生成树实验报告,供学弟学妹们借鉴使用。 其余学校也能使用,文件包含源码。源码绝对正确,这是我的期末作业哈哈。 希望同学们数据结构满绩哈哈。
4. 图:理解图的概念,包括图的存储方式(邻接矩阵、邻接表),图的遍历(深度优先搜索、广度优先搜索),最短路径问题(Dijkstra算法、Floyd算法),最小生成树问题(Prim算法、Kruskal算法)。 5. 排序与查找:...
在ACM竞赛中,贪心算法常用于解决背包问题、任务调度等问题,如霍夫曼编码和Prim算法构建最小生成树。 2. **二分查找**:二分查找是一种在有序数组中查找特定元素的搜索算法。它通过不断缩小搜索范围,每次都将搜索...
而基础图论问题可能包括最短路径、最小生成树等。 2046题可能更倾向于数据结构的运用,比如二叉树、链表、堆、队列或栈等。这些数据结构在解决实际问题时有着广泛的应用,例如在搜索、排序、优先级队列等方面。 ...
- 克鲁斯卡尔(Kruskal)算法:对所有边按权值从小到大排序,依次选择权值最小的边,确保不会形成环,直至选择n-1条边,形成最小生成树。 5. 排序算法的时间复杂度 - 排序算法的时间复杂度根据算法不同而有所差异...
8. **图论应用**:如网络流问题(Ford-Fulkerson算法、Edmonds-Karp算法)、最小生成树算法(Prim's和Kruskal's)等。 9. **数据结构设计与分析**:考察对数据结构的时间复杂性和空间复杂性的理解,如时间复杂度的O...
在ACM竞赛中,贪心算法常用于任务调度、最小生成树、霍夫曼编码等问题。关键在于分析问题的最优子结构和贪心选择性质。 四、搜索 搜索算法通常用于解决有解空间的问题,如深度优先搜索(DFS)和广度优先搜索(BFS)...
3. 图论问题:如最短路径问题(Dijkstra算法、Bellman-Ford算法)、最小生成树(Prim算法、Kruskal算法)等,这些可以通过动态规划的思路进行优化。 4. 字符串问题:如最长公共子序列、编辑距离等,它们可以通过...
4. **图论**:讲解最短路径、最小生成树、网络流等图论问题及其对应的算法,如Dijkstra、Floyd、Prim、Kruskal、Ford-Fulkerson等。 5. **数学应用**:介绍组合数学、数论、几何等在编程中的应用,帮助解决一些需要...
2. **图论**:深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra、Floyd-Warshall、Bellman-Ford)、最小生成树(Prim、Kruskal)等,这些在解决网络问题、旅行商问题等复杂问题时十分关键。...
3. **图论(Graph Theory)**:最短路径算法(Dijkstra、Floyd-Warshall)、拓扑排序、最小生成树(Prim或Kruskal)、网络流等。 4. **字符串处理**:模式匹配(KMP、Boyer-Moore等)、字符串操作、DNA序列分析等。...
2. 贪心算法的应用实例,如霍夫曼编码、Prim最小生成树算法、Dijkstra最短路径算法等,通过实例帮助学生理解贪心算法的工作原理。 3. 贪心算法的局限性,强调虽然贪心算法在某些问题上表现优秀,但并非所有问题都能...
5. **图论**:包括最短路径问题(Dijkstra算法、Floyd算法)、最小生成树(Prim算法、Kruskal算法)等。这些问题在实际生活中如交通网络、信息传输等领域有广泛的应用。 6. **网络流**:解决资源分配、最大流、最小...