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 ...
随机推荐
- When Colon Scripting is comming (脚本最佳体验)
当冒号脚本来临-- 脚本最佳体验 冒号指派 说明; 冒号替代等号指派赋值,当命名声明指派时指定.相当于声明当前作用域的一个名字指派. 当对指定对象的属性赋值时候,依旧请使用等号.即不废弃等号赋值功用, ...
- JQuery中$.ajax()方法参数
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...
- C语言基础学习基本数据类型-字符专属的输入输出函数
可以使用%c说明符以及scanf()和printf()函数来输入输出字符.现在我们将学习专门为面向字符而设计的一对函数:getchar()和putchar().getchar()函数没有参数,它返回来 ...
- layer弹出标签层tab
引入文件: <script type="text/javascript" src="layer/layer.min.js"></script& ...
- Linux shell (一)
echo -e "Hello World! \a \n" # -e 解析反斜杠 read -p "Please input your first name: &q ...
- VueJs一些资料网站链接
https://github.com/liukaijv/laravel-vue-cmshttps://github.com/allan2coder/VUE2-SPA-Tutorialhttps://g ...
- Quartz2D使用
使用Quartz2D前 先导入QuartzCore.framework //划线 //1.获取图形上下文 CGContextRef ctx=UIGraphicsGetCurrentContext() ...
- noi 7219:复杂的整数划分问题
7219:复杂的整数划分问题 查看 提交 统计 提问 总时间限制: 200ms 内存限制: 65536kB 描述 将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>= ...
- [Android] AudioTrack实例
AudioTrack在Android系统中是用于PCM数据的混音.播放,并不涉及到音频的解码.因此MP3这类经过编码的音频格式文件不能直接通过AudioTrack正确地播放,AudioTrack只能播 ...
- PBOC规范研究
一.ISO14443协议和PBOC关于CID的约定 看过协议的人其实都明白,RATS命令中参数字节的低半字节是CID,期中,CID不能为15. ISO14443协议中要求当RATS命令的CID等于0时 ...