题意:

就是裸的最小生成树(MST), 完全图, 边长是实数。

分析:

算是复习一下MST把

方法一: prim 复杂度(n^2)

 #include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + ;
const int inf = 0x3f3f3f3f;
double G[maxn][maxn], dis[maxn];
bool vis[maxn];
int x[maxn], y[maxn];
int N;
double p2pdis(int x1, int y1, int x2, int y2){
double dis = sqrt((x1-x2) * (x1 - x2) + (y1-y2) * (y1-y2));
return dis;
}
int main(){
#if LOCAL
freopen("1.txt","r",stdin);
#endif // LOCAL while(scanf("%d", &N) && N){
memset(G,,sizeof(G));
memset(vis,,sizeof(vis));
for(int i = ; i < N; i++){
scanf("%d %d", &x[i], &y[i]);
} for(int i = ; i < N; i++){
for(int j = ; j < N; j++){
if(j != i){
G[i][j] = p2pdis(x[i],y[i],x[j],y[j]);
}
}
} double ans = ; vis[] = ;
for(int i = ; i < N; i++){
dis[i] = G[][i]; //一开始起点加入树中, 所以可以将dis初始化为起点的出边
} for(int i = ; i < N - ;i++){//除去起点, 还剩n-1个点不在生成树中
double mind = inf;
int j,sel;
for(j = ; j < N; j++){
if(!vis[j] && dis[j] < mind){
mind = dis[j];
sel = j;
}
}
vis[sel] = ;
ans += dis[sel];
for(int k = ; k < N; k++){
if(!vis[k] && dis[k] > G[sel][k]){
dis[k] = G[sel][k]; //注意这里 prim是更新dis到选中点出边距离, dij是更新dis[选中点] + 选中点出边距离
}
}
}
printf("%.2f\n", ans);
}
}

方法二: kruskal 复杂度(MlogM)

 #include <bits/stdc++.h>
using namespace std;
int N;
const int maxn = 1e3 + ;
const int inf = 0x3f3f3f3f; struct edge{
int u;
int v;
double d;
friend bool operator< (edge n1,edge n2){
return n1.d<n2.d;
}
}
;
edge m[maxn*maxn]; double dis[maxn];
bool vis[maxn];
int x[maxn], y[maxn], f[maxn]; int getf(int v){
if(f[v] == v)
return v;
else{
f[v] = getf(f[v]);
return f[v];
}
}
int mer(int v, int u){
int t1, t2;
t1 = getf(v);
t2 = getf(u);
if(t1 != t2){
f[t2] = t1;
return ;
}
return ;
} double p2pdis(int x1, int y1, int x2, int y2){
double dis = sqrt((x1-x2) * (x1 - x2) + (y1-y2) * (y1-y2));
return dis;
}
int main(){ while(scanf("%d", &N) && N){
memset(vis,,sizeof(vis));
for(int i = ; i < N; i++){
scanf("%d %d", &x[i], &y[i]);
} int mcnt = ;
for(int i = ; i < N; i++){
for(int j = ; j < N; j++){
if(j != i){
m[mcnt].u = i;
m[mcnt].v = j;
m[mcnt++].d = p2pdis(x[i],y[i],x[j],y[j]);
}
}
}
sort(m,m+mcnt); //从小到大排序边 for(int i = ; i < N; i ++){//并查集初始化
f[i] = i;
}
double ans = ;
int cnt = ;
for(int i = ; i < mcnt; i++){//从小到大枚举
if(mer(m[i].u, m[i].v)){
// printf("u: %d v: %d\n", m[i].u, m[i]. v);
cnt ++;
ans += m[i].d;
}
if( cnt == N - )//用了n-1条边后退出
break;
}
printf("%.2f\n", ans);
}
return ;
}

UvaLive 4872 Underground Cables (最小生成树)的更多相关文章

  1. UVALive 4872 Underground Cables 最小生成树

    题目链接: 题目 Underground Cables Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %ll ...

  2. POJ 2075 Tangled in Cables 最小生成树

    简单的最小生成树,不过中间却弄了很久,究其原因,主要是第一次做生成树,很多细节不够熟练,find()函数的循环for判断条件是 pre[i]>=0,也就是遇到pre[i]==-1时停止,i就是并 ...

  3. 图论常用算法之一 POJ图论题集【转载】

    POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...

  4. poj2075

    Tangled in Cables Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6348   Accepted: 2505 ...

  5. UVALive - 2515 (最小生成树 kruskal)

    You are assigned to design network connections between certain points in a wide area. You are given ...

  6. 训练指南 UVALive - 5713(最小生成树 + 次小生成树)

    layout: post title: 训练指南 UVALive - 5713(最小生成树 + 次小生成树) author: "luowentaoaa" catalog: true ...

  7. ZOJ2326Tangled in Cables(最小生成树)

    Tangled in Cables Time Limit: 2 Seconds      Memory Limit: 65536 KB You are the owner of SmallCableC ...

  8. 最小生成树求最大比率 UVALive - 5713

    题目链接:https://vjudge.net/problem/UVALive-5713 题意:给出t组数据,每组数据第一行给出一个n,表示点的数量,接下来n行,每行有三个数字,分别是点的坐标x,y和 ...

  9. 最小生成树 prime算法 UVALive - 6437

    题目链接:https://vjudge.net/contest/241341#problem/D 这里有多个发电站,需要求出所有点都和发电站直接或间接相连的最小代价,那么就是求出最小生成树的问题了,有 ...

随机推荐

  1. apicloud运行机制

    1 首先在官网apicloud中,创建项目生成config.xml文件,预设风格. 2 将config.xml文件放在项目跟目录中,Vue项目,必须先打包生产dist文件, 3 本地或者云编译(官方工 ...

  2. [ZPG TEST 116] 最小边权和【生成树相关】

    先将输入的边从小到大排序,对于一条边,它一定连接着两个联通块u与v,那么这条变对于答案的贡献是siz[u] * siz[v] * (边权 + 1) - 1,别问为什么这太显然了,一想就懂... #in ...

  3. Tree Recovery POJ - 2255

    Tree Recovery POJ - 2255 根据树的前序遍历和中序遍历还原后序遍历. (偷懒用了stl的find) #include<iostream> #include<st ...

  4. 对char类型的数组进行冒泡排序

    package maopaopaixu; import java.util.Arrays; import java.util.Scanner; public class Demo02 { public ...

  5. 科普 eclipse中的Java build

    在刚学eclipse的时候,build path是经常会用到的,但经常就是跟着教程走,额就不太懂这是干嘛的,然后今天看见极客视频里有相关的讲解,来记录一下. Build Path 是指定Java工程所 ...

  6. 窗口Dialog

    Dialog是窗口的意思,它是Window的子类.与frame相比,frame是我们大的窗口,而dialog便是那种弹出来和你说话的对话框. Dialog类的默认布局是BorderLayout Dia ...

  7. AJPFX实践 java实现快速排序算法

    快速排序算法使用的分治法策略来把一个序列分为两个子序列来实现排序的思路: 1.从数列中挑出一个元素,称为“基准“2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面 ...

  8. 【Java】包装类型

    Java中的基本类型功能简单,不具备对象的特性,为了使基本类型具备对象的特性,所以出现了包装类,就可以像操作对象一样操作基本类型数据. 一.基本类型对应的包装类 基本类型                ...

  9. Angular jsonp 同源策略的问题

    引用:http://www.cnblogs.com/dengzy/p/5388357.html 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决 ...

  10. oracle 代码块

    oracle 的代码块模板 declare --声明变量 begin --执行业务逻辑 exception --异常处理 end; --结束 注意:代码块每个sql语句结束都要加冒号 eg: --pl ...