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算法)的更多相关文章

  1. POJ-1789 Truck History---最小生成树Prim算法

    题目链接: https://vjudge.net/problem/POJ-1789 题目大意: 用一个7位的string代表一个编号,两个编号之间的distance代表这两个编号之间不同字母的个数.一 ...

  2. 10-最小生成树-Prim算法

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; #def ...

  3. UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解

    思路: Prim: 这道题目中有重边 Prim可以先加一个sec数组来保存重边的次小边,这样不会影响到最小生成树,在算次小生成树时要同时判断次小边(不需判断是否在MST中) Kruskal: Krus ...

  4. hdu 4081 Qin Shi Huang's National Road System(次小生成树prim)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 题意:有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点. ...

  5. UVA10462Is There A Second Way Left? —— 次小生成树 kruskal算法

    题目链接:https://vjudge.net/problem/UVA-10462 Nasa, being the most talented programmer of his time, can’ ...

  6. 次小生成树(Prim + Kruaskal)

    问题引入: 我们先来回想一下生成树是如何定义的,生成树就是用n - 1条边将图中的所有n个顶点都连通为一个连通分量,这样的边连成子树称为生成树. 最小生成树很明显就是生成树中权值最小的生成树,那么我们 ...

  7. The Unique MST POJ - 1679 次小生成树prim

    求次小生成树思路: 先把最小生成树求出来  用一个Max[i][j] 数组把  i点到j 点的道路中 权值最大的那个记录下来 used数组记录该条边有没有被最小生成树使用过   把没有使用过的一条边加 ...

  8. poj1789--最小生成树(prim)

    水题... 题目大意: 用一个7位的字符串代表一个编号,两个编号之间的distance代表这两个编号之间不同字母的个数.一个编号只能由另一个编号“衍生”出来,代价是这两个编号之间相应的distance ...

  9. POJ 1679 The Unique MST (次小生成树kruskal算法)

    The Unique MST 时间限制: 10 Sec  内存限制: 128 MB提交: 25  解决: 10[提交][状态][讨论版] 题目描述 Given a connected undirect ...

随机推荐

  1. poj 3468A Simple Problem with Integers

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  2. UVALive 7276 Wooden Signs

    详细题目见:http://7xjob4.com1.z0.glb.clouddn.com/0f10204481da21e62f8c145939e5828e 思路:记dp[i][j]表示第i个木板尾部在j ...

  3. MySql 执行 DELETE/UPDATE时,报 Error Code: 1175错误

    MySql 执行 DELETE FROM Table 时,报 Error Code: 1175. You are using safe update mode and you tried to upd ...

  4. 在WLS2下开发和部署NET Core3.1目录

    前言 在youtube推送上看到WSL2的消息(https://www.youtube.com/watch?v=MrZolfGm8Zk&t=1s),觉得很棒.恰好最近在学习PowerShell ...

  5. TCP 连接

    面试题传送 TCP 报文格式 此处介绍建立或者断开TCP连接时,需要了解的TCP报文段首部字段含义: 序列号 seq:占4个字节(32位),用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上 ...

  6. leetcode347 python

    通过维护最小堆排序,使用heapq模块 一般使用规则:创建列表 heap = [] 函 数                                                        ...

  7. KEIL5 使用STM32 官方例程

    1. 安装keil5,破解 网上很多安装包/教程,跳过 2.下载官方固件库 https://www.st.com/content/st_com/en.html 在这里找微处理器,STM32 stand ...

  8. codeforces 858A

    A. k-rounding time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. Dapr 正式发布1.0

    年前我写了一篇博客<Dapr 已在塔架就位 将发射新一代微服务>, 今天Dapr 正式发布了1.0 : Dapr Runtime v1.0.0 Dapr dotnet SDK v1.0.0 ...

  10. 基于HSV彩色空间与直方图信息的植物叶脉FFCM算法提取

    宣旭峰,王美丽,张建锋. 基于HSV彩色空间与直方图信息的植物叶脉FFCM算法提取[J/OL]. 计算机应用研究,2018,(08):1-7. (2017-07-21)[2017-10-09]. ht ...