UvaLive 4872 Underground Cables (最小生成树)
题意:
就是裸的最小生成树(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 (最小生成树)的更多相关文章
- UVALive 4872 Underground Cables 最小生成树
题目链接: 题目 Underground Cables Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %ll ...
- POJ 2075 Tangled in Cables 最小生成树
简单的最小生成树,不过中间却弄了很久,究其原因,主要是第一次做生成树,很多细节不够熟练,find()函数的循环for判断条件是 pre[i]>=0,也就是遇到pre[i]==-1时停止,i就是并 ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- poj2075
Tangled in Cables Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6348 Accepted: 2505 ...
- UVALive - 2515 (最小生成树 kruskal)
You are assigned to design network connections between certain points in a wide area. You are given ...
- 训练指南 UVALive - 5713(最小生成树 + 次小生成树)
layout: post title: 训练指南 UVALive - 5713(最小生成树 + 次小生成树) author: "luowentaoaa" catalog: true ...
- ZOJ2326Tangled in Cables(最小生成树)
Tangled in Cables Time Limit: 2 Seconds Memory Limit: 65536 KB You are the owner of SmallCableC ...
- 最小生成树求最大比率 UVALive - 5713
题目链接:https://vjudge.net/problem/UVALive-5713 题意:给出t组数据,每组数据第一行给出一个n,表示点的数量,接下来n行,每行有三个数字,分别是点的坐标x,y和 ...
- 最小生成树 prime算法 UVALive - 6437
题目链接:https://vjudge.net/contest/241341#problem/D 这里有多个发电站,需要求出所有点都和发电站直接或间接相连的最小代价,那么就是求出最小生成树的问题了,有 ...
随机推荐
- tableView 顶部多出一部分解决方法
1.self.automaticallyAdjustsScrollViewInsets = NO; 此方法解决之后 不能保证tableView 能彻底的滑动到底部 2. self.edgesForEx ...
- springMVC RedirectAttributes
@Controller public class TestController { @RequestMapping("/redirectDemo") public String r ...
- pycharm版本选择并安装
pycharm版本选择并安装 一. 初学python最好选择专业版的,因为经测试社区版的很多插件都没有安装,如果自己安装的话会非常麻烦,而且很多根本就安装不上,比如说css,javascript,d ...
- [ZJOI2011]道馆之战
Description 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个 ...
- linux 前台后台程序切换命令总结
1.在Linux终端运行命令的时候,在命令末尾加上 & 符号,就可以让程序在后台运行 root@Ubuntu$ ./tcpserv01 & 2.如果程序正在前台运行,可以使用 Ctrl ...
- Activity状态图、生命周期图(超详细),onSaveInstanceState只保存、恢复基本ui数据,持久数据不在这里保存。
1.Activity状态图 2.Activity生命周期简图 启动Activity: onCreate()—>onStart()—>onResume(),Activity进入running ...
- CoreText的使用方法
- (void)draw { CGContextRef context = UIGraphicsGetCurrentContext(); NSMutableAttributedString *attr ...
- 关于java的arrays数组排序示例AJPFX的分享
Java API对Arrays类的说明是:此类包含用来操作数组(比如排序和搜索)的各种方法. 1.对基本数据类型的数组的排序 说明: (1)Arrays类中的sort()使用的是“经过调优的快速排序法 ...
- flex弹性布局操练2
上一个是练习的1个内元素的,这次练习两个元素的. ul.box1 { list-style:none; background-color:black; display:flex; justify-co ...
- JavaScript——responseType
https://www.cnblogs.com/cdemo/p/5225848.html https://blog.csdn.net/wkyseo/article/details/78232485 异 ...