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 & ...
随机推荐
- bind 简单配置dns
一. 安装apt-get install bind9 apt-get install bind9-host dnsutils apt-get install bind9-doc 二.修改本机配置我们要 ...
- Django简单设置cookies和session
一.Cookie cookie及特点 Cookie是由服务器(网站)生成的,存储在浏览器端的 键值对数据(通常经过加密) 在响应请求时,服务器会把生成 Cookie数据 发给浏览器,浏览器会自动保存( ...
- AC日记——[Wc2008]游览计划 bzoj 2595
2595 思路: 状压DP+spfa转移+dfs输出路径: 或者,斯坦纳树算法模板: 来,上代码: #include <queue> #include <cstdio> #in ...
- Codeforces 798 B. Mike and strings-String的find()函数
好久好久好久之前的一个题,今天翻cf,发现这个题没过,补一下. B. Mike and strings time limit per test 2 seconds memory limit per t ...
- Educational Codeforces Round 31 B. Japanese Crosswords Strike Back【暴力】
B. Japanese Crosswords Strike Back time limit per test 1 second memory limit per test 256 megabytes ...
- Codeforces Beta Round #91 (Div. 2 Only) A. Lucky Division【暴力/判断是不是幸运数字4,7的倍数】
A. Lucky Division time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Python的程序结构[2] -> 类/Class[3] -> 内建类与内建函数
内建类与内建函数的区分 / Distinction of Built-in Type and Function 对于 Python,有许多可以不需要定义或引用就可以使用的函数(类)(参考内建模块),诸 ...
- c++ —— .bat 对拍
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #i ...
- POJ 2739:Sum of Consecutive Prime Numbers(Two pointers)
[题目链接] http://poj.org/problem?id=2739 [题目大意] 求出一个数能被拆分为相邻素数相加的种类 [题解] 将素数筛出到一个数组,题目转化为求区段和等于某数的次数,尺取 ...
- 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)
一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...