LA5713 秦始皇修路 (mst)
题意:
秦朝有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)相关推荐
- 例题5.20 秦始皇修路 LA5713
1.题目描述:点击打开链接 2.解题思路:本题利用次小生成树解决.根据题意,我们希望在O(1)时间内得知"在原图中删除边u-v后的最小生成树的权值",这样,整个问题就可以在O(n^ ...
- LA 5713 秦始皇修路
https://vjudge.net/problem/UVALive-5713 题意: 秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通.道士徐福声称他可以用法术修路,不花钱,也不用劳动 ...
- 秦始皇修路(最小生成树+LCA)
[问题描述] 秦朝有N个城市,需要修建一些道路使得任意两个城市之间都可以相互连通.道士徐福生称他可以用法术修路,不花钱,也不用劳动力,但只能修一条,因此需要慎重选择用法术修建哪一条路. 秦始皇不仅 ...
- 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 ...
- 【数据结构与算法】普里姆算法的介绍和修路问题程序实现
目录 1. 最小生成树的介绍 2. 普里姆算法的介绍 3. 修路问题的介绍 1. 最小生成树的介绍 最小生成树(Minimum Cost Spanning Tree),简称MST.给定一个带权的无向连 ...
- 普里姆算法解决修路问题
一 问题提出 1 胜利乡有7个村庄(A, B, C, D, E, F, G),现在需要修路把7个村庄连通. 2 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里. 问:如何修路保证各个 ...
- 普利姆算法和修路问题
修路问题 看一个应用场景和问题: 有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里 问:如何 ...
- 普利姆算法 修路问题
最小生成树 修路问题本质就是就是最小生成树问题,先介绍一下最小生成树(Minimum CostSpanning Tree),简称MST. 给定一个带权的无向连通图,如何选取一 棵生成树,使树上所有边上 ...
- Java用普里姆算法(prim)解决修路最短路径问题
14.6 普里姆算法 14.6.1 应用场景-修路问题 看一个应用场景和问题: 有胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在需要修路把 7 个村庄连通 各个村庄的距离用边线 ...
- 数据结构与算法-Prim算法解析与解决修路最小生成树问题
文章目录 简介 Prim算法 最小生成树 应用场景 问题描述 思路分析 代码实现 简介 Prim算法 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索 ...
最新文章
- 常用的CSS命名规则
- mysql 一分钟内_MySQL语句需要超过一分钟才能执行
- 【转载】推荐系统-矩阵分解-SVD-通俗易懂
- 什么时候该用MySQL,什么时候该用ES呢?
- Django框架——中间件
- C++学习心得总结【20181128】
- vue 调用c++_electron-vue跨平台桌面应用开发实战教程(七)——ffi调用C++(macOS平台)...
- 一个自动在栈和堆上分配变长数组的实现方式
- 文艺编程 Literate Programming (原文中英文对照)
- python3.7安装步骤-Windows下Python 3.7.0的安装步骤,Python370
- JSP基础(5)-JSP标准动作
- 手机5g什么时候普及_5G手机什么时间普及,现在买4G手机划算吗?
- noip_最后一遍_2-图论部分
- tftp协议 服务器怎么返回错误信息,tftp执行流程
- 会贤固定资产管理软件方案
- 隐秘的度假地_如何避免花太多钱去度假
- Apple Watch Ultra和Apple Watch Series 8 区别 续航 功能介绍
- CVX工具包(for matlab)
- EnjoyToShare | 考研资料分享群
- PHD数据库介绍(一)