题意:

就是裸的最小生成树(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. _bzoj1013 [JSOI2008]球形空间产生器sphere【高斯消元】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1013 保存高斯消元模版. ps,这一题的英文名字是ヨスガノソラ的开发商~^_^ #inclu ...

  2. Environment中有大量访问目录的函数

    public class Environment { /** * Return root of the "system" partition holding the core An ...

  3. C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响)

    C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响),如以下代码将无法通过编译. foreach (int x in myArray) { x++; //错误代码,因为改变 ...

  4. [转]Business Model Canvas(商业模式画布):创业公司做头脑风暴和可行性测试的一大利器

    本文转自:http://www.36kr.com/p/214438.html 本文来自First Round Review,他们准备的文章既讲故事,还同时向创业者提供可操作的建议,以助力打造优秀的公司 ...

  5. jQuery Ajax使用实例

    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.js"></script> <scr ...

  6. git ---查看工作状态和历史提交

    1.git查看状态 -git status 2.版权声明 版权声明:新建一个   LICENSE.txt   文件 开源协议:MIT   //开源许可里面的最宽松的一个协议,别人可以随便用你的代码,但 ...

  7. hibernate对象状态 的小问题

    Class classA{ List a; public void setA(List a) { this.a =a; } public List getA() { return this.a; } ...

  8. 黑马程序员----java基础:异常

    dff ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 经常写程序的人对try...catch...finally语句肯定是不陌生的了.但是好多 ...

  9. Jquery+ashx实现Ajax

    一 Ajax的实现方式 1.使用一般的webform,在页面用jQuery ajax调用,再从取得的html数据中取得<body>内的内容,写入DOM 优点:不用改变现有的asp.net开 ...

  10. angular2快速开始

    简介 5 分钟从0搭建一个ng2项目demohttps://angular.io/docs/js/latest/quickstart.html 你运气真好,竟然看到了这篇文章,你省事了,一分钟让你完成 ...