题目上仅仅给的坐标,没有给出来边的长度,不管是prim算法还是kruskal算法我们都须要知道边的长度来操作。

这道题是浮点数,也没啥大的差别,处理一下就能够了。

有关这两个算法的介绍前面我已经写过了。就不在多写了

prim算法:

<span style="font-family:Courier New;font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
#include<climits>
using namespace std;
struct node
{
double i,j;
}g[105];
double gra[105][105];
double dist(double a,double b,double c,double d)
{
return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
int n,cnt=0,T;
void prim()
{
int visit[105],now,i,j;
double dis[105];
double Min;
memset(visit,0,sizeof(visit));
for(i=1; i<=n; i++)
dis[i] = INT_MAX;
visit[1] = 1, dis[1] = 0, now = 1;//now都是当前新加的点
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(!visit[j] && dis[j]>gra[now][j])//用新加的点来更新其它点到此集合的距离
dis[j] = gra[now][j];
}
Min = INT_MAX;
for(j=1; j<=n; j++)
{
if(!visit[j] && dis[j] < Min)//每次都找到距离最小的点。加进去
Min = dis[now = j];
}
visit[now] = 1;
}
double sum = 0;
for(i=1; i<=n; i++)
{
sum += dis[i];
}
printf("%.2lf\n",sum);
if(cnt!= T)//注意每两个输出案例之间都有一个换行
cout << endl;
}
int main()
{
int i,j;
cin >> T;
while(cin >> n)
{
cnt ++;
for(i=1; i<=n; i++)
{
cin >> g[i].i >> g[i].j;
}
memset(gra,0,sizeof(gra));
for(i=1; i<=n; i++)
{
for(j=i+1; j<=n; j++)
{
gra[i][j] = gra[j][i] = dist(g[i].i,g[i].j,g[j].i,g[j].j);
}
}
prim();
}
return 0;
}
</span>

kruskal算法:

<span style="font-family:Courier New;font-size:18px;">#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
#include<climits>
using namespace std;
struct node
{
int i,j;
double len;
}gra[10005];
struct node1
{
double i,j;
}g[105];
int p[105];
double dist(double a,double b,double c,double d)
{
return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
int cmp(const void *a,const void *b)
{
return (((node *)a)->len - ((node *)b)->len > 0) ? 1:-1;
}
int n,cnt=0,T,k;
int find(int x)
{
return x == p[x]? x: p[x] = find(p[x]);
}
void kruskal()
{
double sum = 0;
int i;
for(i=1; i<k; i++)
{
int x = find(gra[i].i);
int y = find(gra[i].j);
if(x!=y)
{
sum += gra[i].len;
p[x] = y;
}
}
printf("%.2f\n",sum);
if(cnt != T)
cout << endl;
}
int main()
{
int i,j;
cin >> T;
while(cin >> n)
{
cnt ++;
for(i=1; i<=n; i++)
{
cin >> g[i].i >> g[i].j;
}
memset(gra,0,sizeof(gra));
k=1;
for(i=1; i<=n; i++)
{
for(j=i+1; j<=n; j++)
{
gra[k].len = dist(g[i].i,g[i].j,g[j].i,g[j].j);
gra[k].i = i;
gra[k].j = j;
k++;
}
}
//prim();
for(i=1; i<=n; i++)
p[i] = i;
qsort(gra+1,k-1,sizeof(gra[0]),cmp);
kruskal();
}
return 0;
}
</span>

uva 10034 Freckles (kruskal||prim)的更多相关文章

  1. UVA 10034 Freckles 最小生成树

    虽然是道普通的最小生成树题目,可还是中间出了不少问题,暴露的一个问题是不够细心,不够熟练.所以这篇博客就当记录一下bug吧. 代码一:kruskal #include<stdio.h> # ...

  2. UVa 10034 - Freckles

    题目大意:给出n个点的坐标(x,y),要求用线段将n个点连接起来,求最小的线段和. 最小生成树问题,用Kruskal算法进行求解,其中用到了并查集.将所有的点连接,构成一张图,对每一条边进行编号,两点 ...

  3. 10034 - Freckles 克鲁斯克尔最小生成树!~

    /* 10034 - Freckles 克鲁斯克尔最小生成树!- */ #include<iostream> #include<cstdio> #include<cmat ...

  4. uva 10034 Problem A: Freckles

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. 继续畅通工程(kruskal prim)

    kruskal算法   #include <cstdio > #include <algorithm> using namespace std; const int MaxSi ...

  6. 最小生成树模板【kruskal & prim】

    CDOJ 1966 Kruskal 解法 时间复杂度O(mlogm) m为边数,这里主要是边排序占时间,后面并查集还好 #include <cstdio> #include <cst ...

  7. HDU1233(Kruskal&Prim两解)

    https://vjudge.net/problem/HDU-1233 还是畅通工程 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以 ...

  8. POJ1251 Jungle Roads (最小生成树&Kruskal&Prim)题解

    题意: 输入n,然后接下来有n-1行表示边的加边的权值情况.如A 2 B 12 I 25 表示A有两个邻点,B和I,A-B权值是12,A-I权值是25.求连接这棵树的最小权值. 思路: 一开始是在做莫 ...

  9. 几个小模板:topology, dijkstra, spfa, floyd, kruskal, prim

    1.topology: #include <fstream> #include <iostream> #include <algorithm> #include & ...

随机推荐

  1. 函数atof,atoi,atol,strtod,strtol,strtoul 描述

    函数atof,atoi,atol,strtod,strtol,strtoul atof(将字串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul表头文件 #in ...

  2. 用户空间缺页异常pte_handle_fault()分析--(下)--写时复制【转】

    转自:http://blog.csdn.net/vanbreaker/article/details/7955713 版权声明:本文为博主原创文章,未经博主允许不得转载. 在pte_handle_fa ...

  3. Selenium2+python自动化12-操作元素(键盘和鼠标事件)【转载】

    前言 在前面的几篇中重点介绍了一些元素的到位方法,到位到元素后,接下来就是需要操作元素了.本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件 有些web界面的选项菜单需要鼠标悬停在某个元素 ...

  4. svn 基本使用

    通过脚本删除物理文件已经不存在的文件 svn st | sed -n '/!/p' | awk '{print $2}' | xargs svn delete 或 svn st | awk '{if ...

  5. [BZOJ2152]聪聪可可 点分治/树形dp

    2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MB Submit: 3602  Solved: 1858 [Submit][Status][Discu ...

  6. ASP.NET Code First Update-Database

    问题描述: 复制了一个模块化的MVC5的项目,模块化的解释是说不同功能的模块分开来放的. 明确每个模块都是做什么工作的. 首先最基本的,就是根据Apps.Models模块来创建数据库了. 做法是卸载A ...

  7. (2)C#工具箱-公共控件2

    1.MaskedTextBox 限制填写数据格式的文本框 2.MonthCalendar 用法和DateTimePicker相同 日历 3.NotifIcon (1)添加此控件后,此界面运行时会弹出用 ...

  8. Linux的软连接和硬连接

    1.Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接] 硬连接指通过索引 ...

  9. POJ 2482 Stars in Your Window 离散化+扫描法 线段树应用

    遇见poj上最浪漫的题目..题目里图片以上几百词为一篇模板级英文情书.这情感和细腻的文笔深深地打动了我..不会写情书的童鞋速度进来学习.传送门 题意:坐标系内有n个星星,每个星星都有一个亮度c (1& ...

  10. ScrollView起始位置不是最顶部的解决办法

    最近遇到了打开带有ScrollView的页面布局默认起始位置不是最顶部的情况,最后发现问题是因为ScrollView内部嵌套了gridview,只需要设置gridview获取焦点为false即可. g ...