题意:

就是裸的最小生成树(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. B - Burning Midnight Oil CodeForces - 165B

    One day a highly important task was commissioned to Vasya — writing a program in a night. The progra ...

  2. 数据结构 - 链队列的实行(C语言)

    数据结构-链队列的实现 1 链队列的定义 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已, 我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指 ...

  3. Python学习规划

    短时间踏实而高效的学习python 知乎:如何系统的学习python 简书:最全的python学习手册 目录 Python编程语言 python视频教程 Python神经网络算法与深度学习视频教程人工 ...

  4. hdu 6012 Lotus and Horticulture 打标记

    http://acm.hdu.edu.cn/showproblem.php?pid=6012 我们希望能够快速算出,对于每一个温度,都能够算出它在这n颗植物中,能得到多少价值. 那么,对于第i科植物, ...

  5. 转】[MySQL优化]为MySQL数据文件ibdata1瘦身

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! [MySQL优化]为MySQL数据文件ibda ...

  6. 第一次阅读作业 xinzcover

    ---恢复内容开始--- 第一次阅读和准备作业 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1 这个作 ...

  7. Django系列:(1)PyCharm下创建并运行我们的第一个Django工程

    准备工作: 假设读者已经安装好python 2x或3x,以及安装好Django,以及Pycharm. 我的配置: – Python 2.7.11 – Pycharm Professional 5.0. ...

  8. linux下安装xampp

    Choose your flavor for your linux OS, the 32-bit or 64-bit version. Change the permissions to the in ...

  9. iOS Programming Camera 1

     iOS Programming Camera  1 1 Displaying Images and UIImageView 1.1  put an instance of UIImageView o ...

  10. Objective -C Object initialization 对象初始化

    Objective -C Object initialization 对象初始化 1.1 Allocating Objects  分配对象 Allocation is the process by w ...