hdu_1875_畅通工程再续 prim和kruskal
这个题是个典型的最小生成树的题目,但是刚开始怎么都过不了,后来发现两种写法都有疏忽,但是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的更多相关文章
- HDU1875——畅通工程再续(最小生成树:Kruskal算法)
畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...
- hdu 1875 畅通工程再续(prim方法求得最小生成树)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1875 /************************************************* ...
- HDU_1875_畅通工程再续
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 还是畅通工程(prim和kruskal)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) ...
- HDU 1875 畅通工程再续 (Prim)
题目链接:HDU 1875 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现 ...
- hdu1875 畅通工程再续 最小生成树并查集解决---kruskal
http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...
- HDU 1875 畅通工程再续 (prim最小生成树)
B - 畅通工程再续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit S ...
- HDU 1875 畅通工程再续(kruskal)
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 畅通工程再续(MST)
畅通工程再续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
随机推荐
- [C++] 对象地址与接口指针的故事
刚想到一个问题,一直在思考C++中对象地址与接口指针的故事. 问题:多继承的情况下,一个具体类对象实现了多个接口,那么多该对象获取的不同接口指针是一样的吗?不是一样吗?不是对象地址吗?-- 困惑原因, ...
- ejabberd,erlang,简单看了一下,总结一下,很肤浅
本来也没打算深入学习erlang,就是看一下他们的大概思路erlang每个自定义函数都能注册成进程,每个节点通过erl -name 'name@ip'.进去后,可以直接做远程调用,节点之间就靠一个连接 ...
- 试用ubuntu-12.04.3-desktop-amd64
由于工作需要,终于要开始使用大名鼎鼎的ubuntu了,从网上下了个ubuntu-12.04.3-desktop-amd64,通过vmware安装,过程相当顺利,只是装完后重启动,发现回到了命令行模式. ...
- oracle操作字符串:拼接、替换、截取、查找
1.拼接字符串 1)可以使用“||”来拼接字符串 select '拼接'||'字符串' as str from dual 2)通过concat()函数实现 select concat('拼接', '字 ...
- 深入Java虚拟机读书笔记第三章安全
为什么需要安全性 Java的安全模型是其多个重要结构特点之一,它使Java成为适于网络环境的技术.Java安全模型侧重于保护终端用户免受从网络下载的.来自不可靠来源的.恶意程序(以及善于程序中的bug ...
- Css 描点
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- wamp虚拟机配置
1.找到httpd.conf 里面:找到 # Virtual hosts 开启虚拟机Include conf/extra/httpd-vhosts.conf 2 编辑httpd-vhosts.con ...
- B题(覆盖问题)
B - B Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Desc ...
- RAID磁盘阵列0、1、5、10
raid0:(又称为Stripe或Striping--分条) (一句话:raid0 用多个磁盘串联起来成一个大磁盘,容量为几个的总和.优点:容量大,速度快.缺点:数据不安全) 即Data Stripp ...
- MySQL 5.6.22 win32 zip版安装
mysql 5.6.22 32位下载地址:http://cdn.mysql.com//archives/mysql-5.6/mysql-5.6.22-win32.zip 1 从http://dev.m ...