POJ 2560 Freckles(最小生成树)
2014-11-09 22:22
357 查看
题目大意:有n个点,并且知道它们的坐标,求连接所有点的最短路径。
题目分析:
算法:prime算法
1.任选一个点,加入树中,作为第一个树中的点。
2.取距离现有树距离最小的点,加入树中。
3.重复步骤2, 直至所有点都加入到树中。
题目分析:
算法:prime算法
1.任选一个点,加入树中,作为第一个树中的点。
2.取距离现有树距离最小的点,加入树中。
3.重复步骤2, 直至所有点都加入到树中。
#include <cstdio> #include <cmath> #include <iostream> using namespace std; #define INF 1 << 29 int n; double map[101][101]; int vis[101]; double dis[101]; double prim(int x) { int i, j, k; double ans = 0; for(i = 0; i < n; i ++) { vis[i] = 0; dis[i] = map[x][i]; } vis[0] = 1; for(i = 1; i < n; i ++) { double min = INF; for(j = 0; j < n; j ++) { if(min > dis[j] && !vis[j]) { min = dis[j]; k = j; } } vis[k] = 1; ans += min; for(j = 0;j < n; j ++) { if(dis[j] > map[k][j] && !vis[j]) { dis[j] = map[k][j]; } } } return ans; } int main() { int i, j; int k = 0; double x[101]; double y[101]; scanf("%d", &n); for (i = 0; i < 101; i ++) for (j = 0; j < 101; j ++) map[i][j] = 0; for(i = 0; i < n; i ++) scanf("%lf%lf", &x[i], &y[i]); for(i = 0; i < n; i ++) { for(j = i + 1; j < n; j ++) { map[i][j] = map[j][i] = sqrt(double((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]))); } } printf("%.2lf\n", prim(0)); return 0; }
相关文章推荐
- POJ2560_Freckles_最小生成树
- POJ2560 Freckles(prim最小生成树)
- POJ 2560 Freckles(最小生成树-Kruskal)
- POJ 2560 Freckles------最小生成树(水啊)
- poj -2560-Freckles-最小生成树
- Poj(2560),最小生成树,Prim
- poj 2560最小生成树 prim
- 2560 Freckles (最小生成树)
- poj-2560最小生成树
- poj 1258(最小生成树)
- poj 2485(最小生成树)
- POJ_1679 最小生成树是否唯一
- POJ 1861 Networks 最小生成树 Kruskal+并查集
- POJ 1789 Truck History 最小生成树 KRUSKAL算法
- POJ 1789 Truck History 最小生成树 KRUSKAL算法
- POJ 2485 Highways Kruskal+并查集 最小生成树
- POJ 2485 : 最小生成树(kruskal+并查集)
- POJ 1258 : 最小生成树(Prim)
- POJ 1789 最小生成树问题
- POJ 1789-Truck History 最小生成树 Kruskal算法