这个题是个典型的最小生成树的题目,但是刚开始怎么都过不了,后来发现两种写法都有疏忽,但是prim的到目前为止不懂为什么刚开始的不对,kruskal算法,并查集的初始条件从0开始写成从1开始了,所以已知wa,还有这个题比最小生成树一个卡点就是处理两点之间的距离的时候,要保证点都在10-1000之间。其它的没有什么坑了。

代码一(prim)

#include <stdio.h>
#include <string.h>
#include <math.h>
#define INFI 999999999.0 using namespace std;
const int N = ;
typedef struct point
{
int x, y;
}point;
double Map[N][N];
point p[N];
int vis[N];
double ans;
double low_cost[N];
double calc(int a, int b)
{
return sqrt((p[b].y - p[a].y) * (p[b].y - p[a].y) + (p[b].x - p[a].x) * (p[b].x - p[a].x));
}
void calc_distance(int n)
{
memset(Map, , sizeof(Map));
double t;
for (int i = ; i < n; i++)
{
for (int j = i + ; j < n; j++)
{
t = calc(i, j);
if (t >= && t <= )
Map[i][j] = Map[j][i] =calc(i, j);
else
Map[i][j] = Map[j][i] = INFI;
} }
}
int prim(int n)
{
for (int i = ; i < n; i++)
low_cost[i] = Map[][i];
vis[] = ;
for (int i = ; i < n; i++)
{
int k = ;
double min = INFI;
for (int j = ; j < n; j++)
{
if (!vis[j] && min > low_cost[j])
{
min = low_cost[j];
k = j;
}
}
if (k != )
{
vis[k] = ;
ans += min;
}
else
return ;
for (int j = ; j < n; j++)
{
if (!vis[j] && Map[k][j] < low_cost[j])
low_cost[j] = Map[k][j];
}
}
return ;
}
int main()
{
int T, C;
scanf("%d", &T);
while (T--)
{
memset(vis, , sizeof(vis));
ans = 0.0;
scanf("%d", &C);
for (int i = ; i < C; ++i)
scanf("%d %d", &p[i].x, &p[i].y);
calc_distance(C);
int t = prim(C);
if (t == )
{
puts("oh!");
continue;
}
ans *= 100.0;
printf("%.1f\n", ans);
}
return ;
}

代码二(kruskal)

#include<iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define EPS 1e-10
using namespace std;
struct Point{
int x, y;
};
struct edge{
int s, e;
double dis;
};
const int N = ;
int father[N], num[N];
Point p[N];
edge E[N * N / ];
double ans = 0.0;
void init(int n)
{
for (int i = ; i <= n; ++i)
{
father[i] = i;
num[i] = ;
}
}
double calct(int a, int b)
{
return sqrt((p[b].y - p[a].y) * (p[b].y - p[a].y) + (p[b].x - p[a].x) * (p[b].x - p[a].x));
}
int calc_distance(int n)
{
int k = ;
for (int i = ; i < n; i++)
{
for (int j = i + ; j < n; j++)
{
double t = calct(i, j);
if (t >= 10.0 && t <= 1000.0)
{
E[k].s = i;
E[k].e = j;
E[k++].dis = t;
}
}
}
return k;
}
bool cmp(edge a, edge b)
{
return a.dis < b.dis;
}
int find(int x)
{
while (x != father[x])
x = father[x];
return father[x];
}
bool merge(int a, int b)
{
int ta = find(a);
int tb = find(b);
if (ta == tb)
return false;
if (num[ta] > num[tb])
{
father[tb] = ta;
num[ta] += num[tb];
}
else
{
father[ta] = tb;
num[tb] += num[ta];
}
return true;
}
bool kruskal(int n, int len)
{
int k = ;
for (int i = ; i < len; i++)
{
if (merge(E[i].s, E[i].e))
{
++k;
ans += E[i].dis;
}
if (k == n - )
break;
}
if (k == n - )
return true;
return false;
}
int main()
{
int t,n;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
init(n);
ans = 0.0;
for (int i = ; i < n; i++)
scanf("%d %d", &p[i].x, &p[i].y);
int len = calc_distance(n);
sort(E, E + len, cmp);
if (kruskal(n, len))
{
printf("%.1f\n", ans * 100.0);
}
else
puts("oh!");
}
return ;
}

hdu_1875_畅通工程再续 prim和kruskal的更多相关文章

  1. HDU1875——畅通工程再续(最小生成树:Kruskal算法)

    畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...

  2. hdu 1875 畅通工程再续(prim方法求得最小生成树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1875 /************************************************* ...

  3. HDU_1875_畅通工程再续

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  4. 还是畅通工程(prim和kruskal)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    ...

  5. HDU 1875 畅通工程再续 (Prim)

    题目链接:HDU 1875 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现 ...

  6. hdu1875 畅通工程再续 最小生成树并查集解决---kruskal

    http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  7. HDU 1875 畅通工程再续 (prim最小生成树)

    B - 畅通工程再续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit S ...

  8. HDU 1875 畅通工程再续(kruskal)

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  9. 畅通工程再续(MST)

    畅通工程再续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

随机推荐

  1. c++builder向c#开发的webservice传递非数字参数

    一.引用WebService地址 BCB6.0环境下,File-New-Other-WebService-WSDL Importer.然后手动写完整地址.如:“http://192.168.1.3:1 ...

  2. groovy构建和解析xml文件

    原文链接:http://www.ibm.com/developerworks/cn/java/j-pg05199/ 代码示例: 构建xml文件: def static createXmlFile(){ ...

  3. HTML5拖放

    HTML5拖放 <!doctype html> <html> <head> <meta charset="UTF-8"> <t ...

  4. gchart 插件API

    data: 一个二维数组,参数类型如下:[[, , ], [, , ], [, , ]] size: 图片显示的大小 ( width x height ) 300x200 type: 前面已经说过了 ...

  5. UVa 129 Krypton Factor困难的串 (dfs 递归搜索)

    回溯法,只需要判断当前串的后缀,而不是所有的子串 #include<iostream> #include<cstdio> using namespace std; ]; int ...

  6. (推荐)jquery.pagination.js分页

    序言 本来想自己对这个分页使用做一些总结的,但发现大神们已经总结的很好了.所以给推荐一下. 转自:http://www.cnblogs.com/knowledgesea/archive/2013/01 ...

  7. IOS 笔试

    iOS基础教程之Objective-C:Objective-C笔试题 作者:蓝鸥科技 发布于:2012-12-14 14:38 Friday 分类:iOS中级-OC开发 iOS基础教程之Objecti ...

  8. jQuery的live绑定事件在mobile safari(iphone / ipad / ipod)上失效的解决方案

    jQuery的live绑定为什么会在mobile safari上失效呢?其实可以追溯到jQuery里live的实现方式.live的实现方式实际上是通过事件委托机制来实现的,也就是说是通过诸如冒泡的方式 ...

  9. 兼容各浏览器中的PNG透明效果CSS定义

    <style>.mycls{width: 48px;height: 48px;background: url(20090318230119136.png) no-repeat left t ...

  10. 从Profile中窥探Unity的内存管理

    刨根问底U3D---从Profile中窥探Unity的内存管理 这篇文章包含哪些内容 这篇文章从Unity的Profile组件入手,来探讨一下Unity在开发环境和正式环境中的内存使用发面的一些区别, ...