这个题是个典型的最小生成树的题目,但是刚开始怎么都过不了,后来发现两种写法都有疏忽,但是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. 多个显示器, window.open的定位

    // Pops a window relative to the current window position function popup(url, winName, xOffset, yOffs ...

  2. 页面d初始化加载

    1.$(document).ready(function () { alert("Hello Word!"); }); 或简写为 2.$(function(){ alert(&qu ...

  3. RedHat9上安装jdk

    1.先在windows下载jdk:jdk-6-dlj-linux-i586.bin 2.用ftp上传给linux下 3.chmod 777 jdk-6-dlj-linux-i586.bin 4.将jd ...

  4. Ajax.BeginForm 防止跳转到新页面

    @using (Ajax.BeginForm("ChangeCompanyId", "navigation", new { area = "confi ...

  5. 让 IE6/7/8 也支持HTML5标签的方式

    方式一:引入Google的HTML5.js线上文件 <!–[if lt IE9]> <script src="http://html5shiv.googlecode.com ...

  6. poj1159 Palindrome

    G - 回文串 Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   Descripti ...

  7. Oracle的Net Configuration Assistant 配置

    在进行团队开发的时候,一般团队的每一个人只需要安装一个客户端即可,没有必要安装一个Oracle 数据库服务器,而数据库服务器是属于共享的,此时,我们就需要配置客户端.客户端的配置可以有以下两种方式:第 ...

  8. 初谈使用Spring的感受

    我记得刚开始学Spring的时候,只是很自然的把它当做一个类似其他J2EE的框架来学习.那时候学Spring很大一部分是为了以后面试需要,因为毕竟搞Java的,你说不会Spring这都有点说不过去.当 ...

  9. ShapeDrawable 资源

    ShapeDrawable 用于定义一个基本的几何图形(如矩形.圆形.线条等),定义 ShapeDrawable 的 XML 文件的根元素是<shape.../>元素,该元素可指定如下属性 ...

  10. 值得IT运维人员警示的“一件事儿”

    昨天,一个用户打来了紧急求助电话,并且发了邮件,弄得我当时紧张了一下,以为他们那里又出了什么乱子.用户在电话里说:应用系统性能很差,运行很慢,几近“卡死”的感觉,而且重启了多次应用和数据库服务器,最终 ...