题目上仅仅给的坐标,没有给出来边的长度,不管是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. glGenTextures

    http://blog.sina.com.cn/s/blog_67ede2d80100w3i8.html glGenTextures(GLsizei n, GLuint *textures)函数说明 ...

  2. 27.Remove Element---两指针

    题目链接:https://leetcode.com/problems/remove-element/description/ 题目大意:给出一个数组和一个值,从数组中删除与当前值相等的值,并将数组长度 ...

  3. Http与RPC通信协议的比较

    OSI网络结构的七层模型 各层的具体描述如下: 第七层:应用层     定义了用于在网络中进行通信和数据传输的接口 - 用户程式:提供标准服务,比如虚拟终端.文件以及任务的传输 和处理:  第六层:表 ...

  4. HDU 6336 子矩阵求和

    Problem E. Matrix from Arrays Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 ...

  5. Codeforces 839 B. Game of the Rows-贪心

    最近太zz了,老是忘记带脑子... 补的以前的cf,发现脑子不好使...   B. Game of the Rows   time limit per test 1 second memory lim ...

  6. 利用MAP动态创建C++类对象

    MFC的CRuntimeClass利用链表实现了C++类的动态创建.但是如果项目中对动态创建的要求比较低,我们完全可以利用map实现简单的动态创建. http://blog.csdn.net/yeji ...

  7. 内连接(INNER JOIN)

    内连接组合两张表,并且基于两张表中的关联关系来连接它们.使用内连接需要指定表中哪些字段组成关联关系,并且需要指定基于什么条件进行连接.内连接的语法如下: INNER JOIN table_name O ...

  8. luogu P1075 质因数分解

    题目描述 已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数. 输入输出格式 输入格式: 输入只有一行,包含一个正整数n. 输出格式: 输出只有一行,包含一个正整数p,即较大的那个质数. ...

  9. [BZOJ5289][HNOI2018]排列(拓扑排序+pb_ds)

    首先确定将所有a[i]向i连边之后会形成一张图,图上每条有向边i->j表示i要在j之前选. 图上的每个拓扑序都对应一种方案(如果有环显然无解),经过一系列推导可以发现贪心策略与合并的块的大小和w ...

  10. POJ 3264 Balanced Lineup(zkw线段树)

    [题目链接] http://poj.org/problem?id=3264 [题目大意] 求区间最大值和最小值的差值 [题解] 线段树维护区间极值即可 [代码] #include <cstdio ...