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 & ...
随机推荐
- v4l2驱动文档之——streaming IO【转】
转自:http://blog.csdn.net/zoe6553/article/details/17715441 v4l2驱动编写篇第六B--流输入输出 在本系列文章的上一期中,我们讨论了如何通过re ...
- Java解决跨域的方案
在后台加上,在数据返回之前添加 response.setHeader("Access-Control-Allow-Origin","*"); 就可以了,前台不用 ...
- python的位运算
# &: 都是1,才为1,否则为零 # |: 都是0,才为0,否则为1 # ^: 相同为0,相异为1 a = bin(20) b = bin(16) print(a) # 0b10100 pr ...
- Fiddler抓包2-只抓APP的请求【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/p/6582437.html 前言 fiddler抓手机app的请求,估计大部分都会,但是如何只 ...
- python每日一类(5):itertools模块
itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生成器和生成器表达式)的函数联合使用. ch ...
- hdu 5125(LIS变形)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5125 题解: 这个题dp[i][0],dp[i][1]数组分别记录在第i个位置取a[i]和b[i]时 ...
- Switch能否用string做参数
在Java5以前,switch(expr)中,exper只能是byte,short,char,int类型(或其包装类)的常量表达式. 从Java5开始,java中引入了枚举类型,即enum类型. 从J ...
- POJ 1044: Date bugs
题目描述 There are rumors that there are a lot of computers having a problem with the year 2000. As they ...
- 【SQL Server 学习系列】-- sql 随机生成中文名字
原文:[SQL Server 学习系列]-- sql 随机生成中文名字 ,) )) -- 姓氏 ,) )) -- 名字 INSERT @fName VALUES ('赵'),('钱'),('孙'),( ...
- ASIHTTPRequest学习(四)
如果是IOS5的版本,可能集成过程中会遇到一些问题,我也找到了一些解决方案,比如,集成完后可能会遇到编译提示找不到"libxml/HTMLparser.h",解决这个问题可以参考这 ...