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. fiddler抓包+安卓机 完成手机app抓包的配置 遇到的一些问题

    fiddler抓包+安卓模拟器完成手机app抓包的配置:fiddler抓包+雷电模拟器 完成手机app抓包的配置 其实在安卓真机上弄比在虚拟机上弄更麻烦一点,它们的步骤都差不多一样,就是在安卓真机上弄 ...

  2. hdu2818 Building Block

    Problem Description John are playing with blocks. There are N blocks (1 <= N <= 30000) numbere ...

  3. Chapter Zero 0.1.3 其他单元设备以及运作流程

    其他单元设备 五大单元中的控制单元.算数逻辑段元都被整合到CPU的封装中, 但其实系统单元中,不止有CPU(控制单元.算数逻辑单元), 计算机单元还有哪些? 系统单元:系统单元包括CPU.主存储器(内 ...

  4. InstallShield 2013 Limited Edition for Visual Studio

    新建打包项目后,解决方案资源管理器中的结构如下: Project Assistant界面如下: 在Project Assistant中按照步骤创建打包项目: 1.Application Informa ...

  5. VS制作可自动覆盖旧版本的安装包

    1.设置属性 DetectNewerInstalledVersion=TrueInstallAllUsers = TrueRemovePreviousVersion = True 2.增加软件版本号, ...

  6. 1.nginx安装和基本配置

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-07-10 20:56:10 星期三 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...

  7. 2.安装Helm

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-06-25 13:54:15 星期二 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...

  8. npm/yarn查看当前使用源与设置其它源

    npm, yarn查看源和换源: npm config get registry // 查看npm当前镜像源 npm config set registry https://registry.npmj ...

  9. QUIC协议和HTTP3.0技术研究

    QUIC:基于UDP的安全可靠的HTTP/2传输协议 摘要 QUIC(Quick UDP Internet Connection)是一个新的基于UDP的管线化技术和安全传输协议. QUIC提供: 和H ...

  10. 蓝桥杯——试题 算法训练 Sereja and Squares

    Java 代码 ```` import java.util.Scanner; public class Main { private static long num = 0; private stat ...