您的位置:首页 > 其它

杭电ACM1162(prim)

2015-11-22 16:33 281 查看
</pre>题目链接:<a target=_blank target="_blank" href="http://acm.hdu.edu.cn/showproblem.php?pid=1162">http://acm.hdu.edu.cn/showproblem.php?pid=1162</a><p></p><p>题目大意:在一个平面上有若干点,给出它们的横纵坐标,要求求出将这些点全部连通的距离。</p><p>解题思路:最小生成树,prim算法。不同的是输入点坐标之后要自行进行一次转化就变成了标准的最短路径问题。</p><p>AC代码:</p><p></p><pre name="code" class="cpp">#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
#define INF 2000000
struct Node//定义点
{
double x,y;
}point[105];
double realdis[105][105];
int n;
double ddistance(Node a,Node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double prim()
{
double result=0;
double p[105];
bool used[105];
for(int i=1;i<=n;i++)p[i] = realdis[1][i];
memset(used,0,sizeof(used));
for(int i=1;i<=n;i++)
{
double min = INF;
int index;
for(int j=1;j<=n;j++)
{
if(!used[j]&&min>p[j])
{
min = p[j];
index = j;
}
}
result+=p[index];
used[index] = 1;
for(int j=1;j<=n;j++)
{
if(!used[j])
p[j] = realdis[index][j]<p[j]?realdis[index][j]:p[j];
}
}
return result;
}
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
realdis[i][j] = INF;
if(i==j)realdis[i][j] = 0;
}
}
for(int i=1;i<=n;i++)
{
cin>>point[i].x>>point[i].y;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
realdis[i][j] = ddistance(point[i],point[j]);
}
}
printf("%.2lf\n",prim());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 杭电 算法