题意:

秦朝有n个城市,需要修路让每个城市都互相连通,现在可以免费修一条路,秦始皇希望他除了这条免费修的路外所需修的路的总和B最短,同时这条免费的路连接的人口之和A尽可能大,求最大的A/B是多少,城市之间的长度为欧几里得距离

思路:

这题是一个典型的最小生成树的题目。首先应该先求出最小生成树,其权值之和为W,然后再根据MST的回路性质,算出每一条路径对应的最大边权值,再进行遍历,求出最大的A/B即可

代码有参考这里

AC代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
#include <map>
#include <vector>
#include <algorithm>
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
const int maxn=1010;struct Edge
{int a,b;double d;bool operator < (const Edge& rhs) const{return d < rhs.d;}
};int x[maxn];
int y[maxn];
int p[maxn];
int n;
Edge e[maxn*maxn];//G是与该节点相连的节点的编号,C是相应的cost
vector<int> G[maxn];
vector<double> C[maxn];int par[maxn];void init(){for(int i=0;i<n;i++){par[i]=i;G[i].clear();C[i].clear();}
}//int find(int x){return x==find(x)?x:par[x]=find(par[x]);}int find(int x)
{if(x!=par[x])par[x] = find(par[x]);return par[x];
}bool unite(int x,int y){x=find(x);y=find(y);if(x==y){return false;}else{par[x]=y;return true;}
}double mst(){int cnt=0;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){e[cnt].a=i;e[cnt].b=j;e[cnt].d=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));cnt++;}}
//    cout<<"ss"<<endl;sort(e,e+cnt);init();for(int i=0; i<n; i++){par[i] = i;G[i].clear();C[i].clear();}double ans=0;int cnt2=0;
//    cout<<"aa"<<endl;for(int i=0;i<cnt;i++){if(unite(e[i].a,e[i].b)){G[e[i].a].push_back(e[i].b);C[e[i].a].push_back(e[i].d);G[e[i].b].push_back(e[i].a);C[e[i].b].push_back(e[i].d);ans+=e[i].d;cnt2++;if(cnt2==n-1) break;}}//    cout<<ans<<endl;return ans;
}double costs[maxn][maxn];
vector<int> nodes;//u是现在在搜索的节点,fa是u的父节点(从哪来),facost是之前来的那条路的cost
void dfs(int u, int fa, double facost)
{for(int i = 0; i < nodes.size(); i++){int x = nodes[i];costs[u][x] = costs[x][u] = max(costs[x][fa], facost);}nodes.push_back(u);for(int i = 0; i < G[u].size(); i++){int v = G[u][i];if(v != fa)dfs(v, u, C[u][i]);}
}int main(){int t;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d%d%d",&x[i],&y[i],&p[i]);}
//        cout<<"hh"<<endl;double total=mst();memset(costs,0,sizeof(costs));nodes.clear();dfs(0, -1, 0);double ans = -1;for(int i=0; i<n; i++){for(int j=i+1; j<n; j++){ans = max(ans,(p[i]+p[j])/(total-costs[i][j]));}}printf("%.2lf\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/87hbteo/p/8948446.html

LA5713 秦始皇修路 (mst)相关推荐

  1. 例题5.20 秦始皇修路 LA5713

    1.题目描述:点击打开链接 2.解题思路:本题利用次小生成树解决.根据题意,我们希望在O(1)时间内得知"在原图中删除边u-v后的最小生成树的权值",这样,整个问题就可以在O(n^ ...

  2. LA 5713 秦始皇修路

    https://vjudge.net/problem/UVALive-5713 题意: 秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通.道士徐福声称他可以用法术修路,不花钱,也不用劳动 ...

  3. 秦始皇修路(最小生成树+LCA)

    [问题描述]   秦朝有N个城市,需要修建一些道路使得任意两个城市之间都可以相互连通.道士徐福生称他可以用法术修路,不花钱,也不用劳动力,但只能修一条,因此需要慎重选择用法术修建哪一条路. 秦始皇不仅 ...

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

    题目:Qin Shi Huang's National Road System Qin Shi Huang's National Road System Time Limit: 2000/1000 M ...

  5. 【数据结构与算法】普里姆算法的介绍和修路问题程序实现

    目录 1. 最小生成树的介绍 2. 普里姆算法的介绍 3. 修路问题的介绍 1. 最小生成树的介绍 最小生成树(Minimum Cost Spanning Tree),简称MST.给定一个带权的无向连 ...

  6. 普里姆算法解决修路问题

    一 问题提出 1 胜利乡有7个村庄(A, B, C, D, E, F, G),现在需要修路把7个村庄连通. 2 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里. 问:如何修路保证各个 ...

  7. 普利姆算法和修路问题

    修路问题 看一个应用场景和问题: 有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里 问:如何 ...

  8. 普利姆算法 修路问题

    最小生成树 修路问题本质就是就是最小生成树问题,先介绍一下最小生成树(Minimum CostSpanning Tree),简称MST. 给定一个带权的无向连通图,如何选取一 棵生成树,使树上所有边上 ...

  9. Java用普里姆算法(prim)解决修路最短路径问题

    14.6 普里姆算法 14.6.1 应用场景-修路问题 看一个应用场景和问题: 有胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在需要修路把 7 个村庄连通 各个村庄的距离用边线 ...

  10. 数据结构与算法-Prim算法解析与解决修路最小生成树问题

    文章目录 简介 Prim算法 最小生成树 应用场景 问题描述 思路分析 代码实现 简介 Prim算法 ​ 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索 ...

最新文章

  1. 常用的CSS命名规则
  2. mysql 一分钟内_MySQL语句需要超过一分钟才能执行
  3. 【转载】推荐系统-矩阵分解-SVD-通俗易懂
  4. 什么时候该用MySQL,什么时候该用ES呢?
  5. Django框架——中间件
  6. C++学习心得总结【20181128】
  7. vue 调用c++_electron-vue跨平台桌面应用开发实战教程(七)——ffi调用C++(macOS平台)...
  8. 一个自动在栈和堆上分配变长数组的实现方式
  9. 文艺编程 Literate Programming (原文中英文对照)
  10. python3.7安装步骤-Windows下Python 3.7.0的安装步骤,Python370
  11. JSP基础(5)-JSP标准动作
  12. 手机5g什么时候普及_5G手机什么时间普及,现在买4G手机划算吗?
  13. noip_最后一遍_2-图论部分
  14. tftp协议 服务器怎么返回错误信息,tftp执行流程
  15. 会贤固定资产管理软件方案
  16. 隐秘的度假地_如何避免花太多钱去度假
  17. Apple Watch Ultra和Apple Watch Series 8 区别 续航 功能介绍
  18. CVX工具包(for matlab)
  19. EnjoyToShare | 考研资料分享群
  20. PHD数据库介绍(一)

热门文章

  1. WEB服务器有哪几种
  2. 一张对数字图像处理贡献最大的花花公子人体照
  3. win10系统架设魔兽服务器,win10系统局域网魔兽争霸无法联机的步骤
  4. 【rfc5506】RTCP mode
  5. JAVA中如何计算文具店总费用,文具店的连锁属于。
  6. ubuntu SSH 链接服务器加代理
  7. fuzzy extractor 模糊提取器的代码解读和实现
  8. 语音识别使用推荐(讯飞、百度、腾讯、云知声等)
  9. Win11电脑系统使用U盘安装的方法分享
  10. Win7桌面为什么变黑了?Win10未激活