uva 10034 Freckles (kruskal||prim)
题目上仅仅给的坐标,没有给出来边的长度,不管是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)的更多相关文章
- UVA 10034 Freckles 最小生成树
虽然是道普通的最小生成树题目,可还是中间出了不少问题,暴露的一个问题是不够细心,不够熟练.所以这篇博客就当记录一下bug吧. 代码一:kruskal #include<stdio.h> # ...
- UVa 10034 - Freckles
题目大意:给出n个点的坐标(x,y),要求用线段将n个点连接起来,求最小的线段和. 最小生成树问题,用Kruskal算法进行求解,其中用到了并查集.将所有的点连接,构成一张图,对每一条边进行编号,两点 ...
- 10034 - Freckles 克鲁斯克尔最小生成树!~
/* 10034 - Freckles 克鲁斯克尔最小生成树!- */ #include<iostream> #include<cstdio> #include<cmat ...
- uva 10034 Problem A: Freckles
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- 继续畅通工程(kruskal prim)
kruskal算法 #include <cstdio > #include <algorithm> using namespace std; const int MaxSi ...
- 最小生成树模板【kruskal & prim】
CDOJ 1966 Kruskal 解法 时间复杂度O(mlogm) m为边数,这里主要是边排序占时间,后面并查集还好 #include <cstdio> #include <cst ...
- HDU1233(Kruskal&Prim两解)
https://vjudge.net/problem/HDU-1233 还是畅通工程 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以 ...
- POJ1251 Jungle Roads (最小生成树&Kruskal&Prim)题解
题意: 输入n,然后接下来有n-1行表示边的加边的权值情况.如A 2 B 12 I 25 表示A有两个邻点,B和I,A-B权值是12,A-I权值是25.求连接这棵树的最小权值. 思路: 一开始是在做莫 ...
- 几个小模板:topology, dijkstra, spfa, floyd, kruskal, prim
1.topology: #include <fstream> #include <iostream> #include <algorithm> #include & ...
随机推荐
- RxVolley报错:Caused by: java.lang.RuntimeException: RequestQueue-> DiskBasedCache cache dir error
Caused by: java.lang.RuntimeException: RequestQueue-> DiskBasedCache cache dir error 这是因为SD卡动态权限导 ...
- C++文件(夹)选择对话框
由于各种应用,我们需要调用系统的打开文件对话框或者打开文件夹对话框,或两者兼有.今遇到这个情况已经解决,特写下这篇博文. 1.打开文件对话框常用的方法是使用系统的CFileDialog.这里介绍另外一 ...
- redis集群PHP解决方案
Redis3.2.4 Cluster集群搭建 服务器环境:192.168.3.229192.168.3.193每台服务器搭建3个节点,组成3个主节点,3个从节点的redis集群. 注意:防火墙一定要开 ...
- 传输网页数据的json与xml
#转载请留言联系 1.json json是数据格式,经常用于在网络中,不同平台或者不同语言中进行数据的传输.json的文件后缀就是 .json.当然,也可以把json直接写在js文件中. json储存 ...
- C#中使用aria2c进行下载并显示进度条
正则表达式的生成网站: http://www.txt2re.com/index-csharp.php3 Aria2c下载地址: https://github.com/aria2/aria2/relea ...
- 在Visual Studio 2013 上开发Node.js程序
[题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...
- 关于JAVA SESSION的小测试
手生就要多练啊... package com.jeelearning.servlet; import java.io.IOException; import java.io.PrintWriter; ...
- Ubuntu16.10 +python3.5+Tensorflow 1.1
1.python版本检查 因为Ubuntu16.10已经默认安装了python2.7 和 3.5,检查python版本, 如果为python2.7,那么就需要我们设置python3.5为默认版本. 查 ...
- POJ 2528.Mayor's posters-线段树(成段替换、离散数据、简单hash)
POJ2528.Mayor's posters 这道题真的是线段数的经典的题目,因为数据很大,直接建树的话肯定不可以,所以需要将数据处理一下,没有接触离散化的时候感觉离散化这个东西相当高级,其实在不知 ...
- UVA 10129 Play on Words (欧拉通路)
本文链接:http://www.cnblogs.com/Ash-ly/p/5398627.html 题意: 输入N(N <= 100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单 ...