HDOJ-4081(次小生成树+Prim算法)
Qin Shi Huang's National Road System
HDOJ-4081
- 本题考查的是次小生成树的问题,这里的解决方法就是先使用Prim算法求解最小生成树。
- 在求解最小生成树的时候通过一个数组记录每一对顶点之间的路径上长度最长的一条边。这个由一个cost数组记录。
- 最后,再依次遍历每一对顶点,如果这对顶点不在最小生成树里面,则直接去掉这条边改成魔法边。否则就将这对顶点之间的那条路径上面最长的一条边去掉,用i,j这对顶点代替。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<cmath>
using namespace std;
const int maxn=1004;
const int maxm=1000006;
const int INF=0x3f3f3f3f;
int n;//nodes
int m;//edges
struct node{
int x;
int y;
int p;//人口
};
node cities[maxn];
struct edge{
int from;
int to;
double w;//distance
};
edge edges[maxm];
double map[maxn][maxn];
double mincost[maxn];
bool used[maxn];
int father[maxn];
double cost[maxn][maxn];//表示i,j路径上最长的一条边的长度
double cal(int i,int j){
double x=(double)((cities[i].x-cities[j].x)*(cities[i].x-cities[j].x));
double y=(double)((cities[i].y-cities[j].y)*(cities[i].y-cities[j].y));
return sqrt(x+y);
}
double prim(){
memset(cost,0,sizeof(cost));
for(int i=0;i<n;i++){
mincost[i]=INF;
used[i]=0;
father[i]=i;
}
mincost[0]=0;
double ans=0;//总和长度
while(true){
int v=-1;
for(int u=0;u<n;u++){
if(!used[u]&&(v==-1||mincost[u]<mincost[v])){
v=u;
}
}
if(v==-1)
break;
used[v]=1;
ans+=mincost[v];
for(int j=0;j<n;j++){
if(j==v)
continue;
if(used[j])
cost[j][v]=cost[v][j]=max(mincost[v],cost[father[v]][j]);
}
for(int u=0;u<n;u++){
if(!used[u]&&mincost[u]>map[v][u]){
mincost[u]=map[v][u];
father[u]=v;
}
}
}
return ans;
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
int x,y,p;
for(int i=0;i<n;i++){
cin>>x>>y>>p;
cities[i].x=x,cities[i].y=y,cities[i].p=p;
}
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
double dis=cal(i,j);
map[i][j]=dis;
map[j][i]=dis;
edges[m].from=i;
edges[m].to=j;
edges[m++].w=dis;
}
map[i][i]=0;
}
double distance=prim();
double ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j)
continue;
if(i!=father[j]&&j!=father[i]){//i,j这条边不在最小生成树里面
ans=max(ans,(cities[i].p+cities[j].p)/(distance-cost[i][j]));
}else{//i,j这条边在最小生成树里面
ans=max(ans,(cities[i].p+cities[j].p)/(distance-map[i][j]));
}
}
}
printf("%.2f\n",ans);//注意这里不需要加0.005,自动舍入为四舍五入
}
//system("pause");
return 0;
}
HDOJ-4081(次小生成树+Prim算法)的更多相关文章
- POJ-1789 Truck History---最小生成树Prim算法
题目链接: https://vjudge.net/problem/POJ-1789 题目大意: 用一个7位的string代表一个编号,两个编号之间的distance代表这两个编号之间不同字母的个数.一 ...
- 10-最小生成树-Prim算法
#include <iostream> #include <cstring> #include <cstdio> using namespace std; #def ...
- UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
思路: Prim: 这道题目中有重边 Prim可以先加一个sec数组来保存重边的次小边,这样不会影响到最小生成树,在算次小生成树时要同时判断次小边(不需判断是否在MST中) Kruskal: Krus ...
- hdu 4081 Qin Shi Huang's National Road System(次小生成树prim)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 题意:有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点. ...
- UVA10462Is There A Second Way Left? —— 次小生成树 kruskal算法
题目链接:https://vjudge.net/problem/UVA-10462 Nasa, being the most talented programmer of his time, can’ ...
- 次小生成树(Prim + Kruaskal)
问题引入: 我们先来回想一下生成树是如何定义的,生成树就是用n - 1条边将图中的所有n个顶点都连通为一个连通分量,这样的边连成子树称为生成树. 最小生成树很明显就是生成树中权值最小的生成树,那么我们 ...
- The Unique MST POJ - 1679 次小生成树prim
求次小生成树思路: 先把最小生成树求出来 用一个Max[i][j] 数组把 i点到j 点的道路中 权值最大的那个记录下来 used数组记录该条边有没有被最小生成树使用过 把没有使用过的一条边加 ...
- poj1789--最小生成树(prim)
水题... 题目大意: 用一个7位的字符串代表一个编号,两个编号之间的distance代表这两个编号之间不同字母的个数.一个编号只能由另一个编号“衍生”出来,代价是这两个编号之间相应的distance ...
- POJ 1679 The Unique MST (次小生成树kruskal算法)
The Unique MST 时间限制: 10 Sec 内存限制: 128 MB提交: 25 解决: 10[提交][状态][讨论版] 题目描述 Given a connected undirect ...
随机推荐
- S - Layout (最短路&&差分约束)
Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 < ...
- Eclipse无法打开提示could not open jvm.cfg错误
先言:我的问题只是出在之前我的java_jdk原来安装在F:\Temp这里,但是我之后在整理文件的时候把这个文件夹改成了F:\java_jdk.所以导致了错误的出现 解决方法1: 因为我的只是目录名称 ...
- Is It A Tree? POJ - 1308
题意: 题目给你一组单向边,当遇到输入0 0就证明这是一组边,当遇到-1 -1就要停止程序.让你判断这是不是一棵树 题解: 题目很简单,但是程序要考虑的很多 1.因为是一颗树,所以肯定不能出现环,这个 ...
- python代理池的构建1——代理IP类的构建,以及配置文件、日志文件、requests请求头
一.整体结构 二.代理IP类的构建(domain.py文件) ''' 实现_ init_ 方法, 负责初始化,包含如下字段: ip: 代理的IP地址 port:代理IP的端口号 protocol: 代 ...
- 最小生成树 Prim和Kruskal
感觉挺简单的,Prim和Dijkstra差不多,Kruskal搞个并查集就行了,直接上代码吧,核心思路都是找最小的边. Prim int n,m; int g[N][N]; int u,v; int ...
- 【ybt高效进阶2-4-3】【luogu P4551】最长异或路径
最长异或路径 题目链接:ybt高效进阶2-4-3 / luogu P4551 题目大意 给定一棵 n 个点的带权树,结点下标从 1 开始到 N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指 ...
- Redis 多实例 & 主从复制
Redis 多实例 多实例目录 [root@db01 ~]# mkdir /service/redis/{6380,6381} 多实例配置文件 # 第一台多实例配置 [root@db01 ~]# vi ...
- OpenStack Train版-15.创建并挂载存储卷
1.创建并挂载存储卷 创建一个1GB的卷 source ~/demo-openrc openstack volume create --size 1 volume1 很短的时间后,卷状态应该从crea ...
- Win7下安装IIS
安装IIS 1.控制面板 --> 程序 --> 卸载程序,进入"程序与功能". 2.进入"打开或关闭Window功能". 3.找到"Int ...
- Ruby on Rails
Ruby on Rails 是一个可以使你开发,部署,维护 web 应用程序变得简单的框架.在2004年7月,由Rails的创始人大卫·海纳梅尔·韩森从37signals公司的项目管理工具Baseca ...