最小生成树模板(poj3625)
Building Roads
Description Farmer John had just acquired several new farms! He wants to connect the farms with roads so that he can travel from any farm to any other farm via a sequence of roads; roads already connect some of the farms. Each of the N (1 ≤ N ≤ 1,000) farms (conveniently numbered 1..N) is represented by a position (Xi, Yi) on the plane (0 ≤ Xi ≤ 1,000,000; 0 ≤ Yi ≤ 1,000,000). Input * Line 1: Two space-separated integers: N and M Output * Line 1: Smallest length of additional roads required to connect all farms, printed without rounding to two decimal places. Be sure to calculate distances as 64-bit floating point numbers. Sample Input 4 1 Sample Output 4.00 Source |
prim算法:
Memory: 8072K | Time: 188MS | |
Language: C++ | Result: Accepted |
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 1001;
double graph[N][N];
bool visit[N];
int n,M;
typedef struct
{
double x;
double y;
}dian;
dian m[N]; double prim()
{ memset(visit,0,sizeof(visit)); double low[1001];
int pos = 1;
visit[1] = 1;
double result = 0; for(int i = 2; i <= n; i++)
{
low[i] = graph[pos][i];
} for(int i = 0; i < n-1; i++)
{
double Min = INF; for(int j = 1; j <= n; j++)
{
if(!visit[j] && Min > low[j])
{
Min = low[j];
pos = j; }
}
visit[pos] = 1;
result += Min; for(int i = 1; i <= n; i++)
{
if(!visit[i] && low[i] > graph[pos][i])
{
low[i] = graph[pos][i];
}
} }
return result;
} double dis(dian a,dian b)
{
return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
} int main()
{
// freopen("in.txt","r",stdin);
while(cin>>n>>M)
{
memset(graph,INF,sizeof(graph));
for(int i = 1; i <=n;i++)
{
cin >> m[i].x>>m[i].y;
}
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
graph[i][j] = graph[j][i] = dis(m[i],m[j]);
}
}
for(int i = 0; i < M ; i++)
{
int a,b;
cin>>a>>b;
graph[a][b] = graph[b][a] = 0;
}
printf("%.2lf\n",prim());
}
return 0;
}
kruskal算法
Memory: 8604K | Time: 735MS | |
Language: G++ | Result: Accepted |
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1001;
const int E = 1000000;
int n, M;
int cent;
int a[N];
int Count = 0; typedef struct
{
int x;
int y;
double vaule;
}dian;
dian m[E]; typedef struct
{
double x, y;
}situation;
situation p[N]; double dis(situation a, situation b)
{
return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y) * (a.y - b.y));
} bool cmp(dian a, dian b)
{
return a.vaule < b.vaule;
} void init()
{
// cent 这里应该初始化到n
for (int i = 1; i <= n; i++)
{
a[i] = i;
}
} int Find(int x)
{
while (x != a[x])
{
x = a[x];
}
return x;
} void Union(int x, int y)
{
// 建议做路径压缩
int fx = Find(x);
int fy = Find(y);
if (fx != fy)
{
a[fx] = fy;
}
} double Kruskal()
{
// init(); 不应该在这里init
sort(m, m + cent, cmp);
double result = 0;
for (int i = 0; i < cent&&Count != n - 1; i++)
{
if (Find(m[i].x) != Find(m[i].y))
{
Union(m[i].x, m[i].y);
result += m[i].vaule;
Count++;
}
}
return result;
} int main()
{
while (cin >> n >> M)
{ for (int i = 1; i <= n; i++)
{
cin >> p[i].x >> p[i].y;
}
cent = 0;
Count = 0;
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
{
m[cent].x = i;
m[cent].y = j;
m[cent++].vaule = dis(p[i], p[j]);
}
}
// init不应该放在Kruskal里面
init();
for (int i = 1; i <= M; i++)
{
int a, b;
cin >> a >> b;
// 这里还是要检查Find a 和 Find b是不是一样,不然Count会错
if (Find(a) != Find(b)) {
Union(a, b);
Count++;
}
} printf("%.2f\n", Kruskal());
}
return 0;
}
注意g++交的时候doubl要用f不用lf
最小生成树模板(poj3625)的更多相关文章
- poj 1258 最小生成树 模板
POJ 最小生成树模板 Kruskal算法 #include<iostream> #include<algorithm> #include<stdio.h> #in ...
- POJ-图论-最小生成树模板
POJ-图论-最小生成树模板 Kruskal算法 1.初始时所有结点属于孤立的集合. 2.按照边权递增顺序遍历所有的边,若遍历到的边两个顶点仍分属不同的集合(该边即为连通这两个集合的边中权值最小的那条 ...
- POJ 2031 Building a Space Station 最小生成树模板
题目大意:在三维坐标中给出n个细胞的x,y,z坐标和半径r.如果两个点相交或相切则不用修路,否则修一条路连接两个细胞的表面,求最小生成树. 题目思路:最小生成树树模板过了,没啥说的 #include& ...
- 最小生成树模板【kruskal & prim】
CDOJ 1966 Kruskal 解法 时间复杂度O(mlogm) m为边数,这里主要是边排序占时间,后面并查集还好 #include <cstdio> #include <cst ...
- luogu p3366 最小生成树模板
倒腾了一个小时 自己也没去看网上的 总算自己能写出来模板了 kruskal //最小生成树 每次找最短的边 #include<bits/stdc++.h> using namespace ...
- 最小生成树模板题-----P3366 【模板】最小生成树
题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入格式 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M<=200000) ...
- Prime算法 与 Kruskal算法求最小生成树模板
算法原理参考链接 ==> UESTC算法讲堂——最小生成树 关于两种算法的复杂度分析 ==> http://blog.csdn.net/haskei/article/details/531 ...
- POJ 1789 Truck History (Kruskal最小生成树) 模板题
Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for v ...
- POJ 1258:Agri-Net Prim最小生成树模板题
Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45050 Accepted: 18479 Descri ...
随机推荐
- 从flappy bird中论优化
前两天刚刚做完2014年noipD1T3飞扬的小鸟 其实这道题本身并不是一道很难的DP 状态容易想到,转移也容易想到 但是出于我的基础较差,还是出了较大的偏差 Problem: Flappy Bird ...
- flask web 表单验证 WTForms
简介 WTForms 是一个flask集成框架,或者说是库,用于处理浏览器表单提交的数据,它在flask-WTF的基础上扩展并添加了一些随手可得的精巧帮助函数,这些函数将会是在flask里使用表单更加 ...
- mysql多表查询 查询排序
有 ask 问题表 和 answer回答表 回答表中的ask_id和 ask表中的id对应 1.查询 /*查询回答了的 */select a.id,a.title,count(b.ask_id) ...
- ACM_百度的面试(单调栈)
百度的面试 Time Limit: 2000/1000ms (Java/Others) Problem Description: 在一个二维平面,从左到右竖立n根高度分别为:a[1],a[2],... ...
- SQL Sever语言 事务
事务:保障流程的完整执行保证程序某些程序在运行时同时成功同时失败,保证程序的安全性 begin tran --在流程开始的位置加 --此处写SQL语句 if @@error>0 --ERRORS ...
- MVC系列学习(十四)-路由规则及路由调试工具
1.本次学习的代码,比较简单,就是在路由配置文件中,添加一个路由信息:同时添加一个相应的控制器及视图 控制器中代码如下 即有两条路由匹配规则,一个Kim控制器,该控制器下有个Index的方法,和一个对 ...
- [转]深入理解/proc目录
Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过 ...
- JS——scroll
scrollWidth:父div宽度小于子div宽度,父div scrollWidth宽度为子div的宽度,大于则为本身的宽度width+padding scrollHeight:父div高度小于子d ...
- servlet的多线程并发问题
package gz.itcast.e_thread; import java.io.IOException; import javax.servlet.ServletException; impor ...
- TensorFlow:Windows下使用TensorFlow-Python版本
原文链接:Win10X64下安装使用TensorFlow 安装TensorFlow 由于Google那帮人已经把 TensorFlow 打成了一个 pip 安装包,所以现在可以用正常安装包的方式安装 ...