秦始皇修路,白书P345LA5713(最小生成树,Kruskal算法)
来源:互联网 发布:js date对象 编辑:程序博客网 时间:2024/05/18 09:04
思路关键,道士可以修任意一条道路,为了节省财力,正常应该让道士打通权值最大的一条路。但是仔细分析,由于道士没有成本,打通道路无花费,所以如果k和m城市之间的道路权值最大,并不一定非要打通k和m城市,只要两城市之间的唯一路径通过km边都可以打通这两个城市。所以本题加了第二个限制条件,尽量满足道士打通的城市人口最大…..
知识要点:
1.Kruskal算法求最小生成树。
2.DFS求书上任意两节点唯一路径上的最大权值。
// LA5713 Qin Shi Huang's National Road System// Rujia Liu#include<cstdio>#include<cmath>#include<cstring>#include<vector>#include<algorithm>using namespace std;const int maxn = 1000 + 10;int n, m, x[maxn], y[maxn], p[maxn];int pa[maxn];int findset(int x) { return pa[x] != x ? pa[x] = findset(pa[x]) : x; } //并查集 vector<int> G[maxn];vector<double> C[maxn];struct Edge { int x, y; double d; bool operator < (const Edge& rhs) const { return d < rhs.d; }};Edge e[maxn*maxn];double maxcost[maxn][maxn];vector<int> nodes;void dfs(int u, int fa, double facost) { for(int i = 0; i < nodes.size(); i++) { int x = nodes[i]; maxcost[u][x] = maxcost[x][u] = max(maxcost[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]); }}double MST() {//最小生成树算法 m = 0; for(int i = 0; i < n; i++) for(int j = i+1; j < n; j++) e[m++] = (Edge) { i, j, sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i] - y[j])*(y[i] - y[j])) }; sort(e, e+m); for(int i = 0; i < n; i++) { pa[i] = i; G[i].clear(); C[i].clear(); } int cnt = 0; double ans = 0; for(int i = 0; i < m; i++) { int x = e[i].x, y = e[i].y, u = findset(x), v = findset(y); double d = e[i].d; if(u != v) { pa[u] = v; G[x].push_back(y); C[x].push_back(d); G[y].push_back(x); C[y].push_back(d); ans += d; if(++cnt == n-1) break; } } return ans;}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]); double tot = MST(); memset(maxcost, 0, sizeof(maxcost)); 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]) / (tot - maxcost[i][j])); } printf("%.2lf\n", ans); } return 0;}
阅读全文
0 0
- 秦始皇修路,白书P345LA5713(最小生成树,Kruskal算法)
- Kruskal,次小生成树,最小瓶颈路(秦始皇修路,LA 5713)
- 最小生成树(修路)
- poj 宝昌县长要修路(Kruskal最小生成树)
- 【UVALIVE 5713】秦始皇修路(最小瓶颈路+Kruskal)
- 最小生成树算法(prim&kruskal)
- poj1251最小生成树(kruskal算法)
- 最小生成树 kruskal(算法)
- 最小生成树(Kruskal算法)--poj2421
- 最小生成树(kruskal算法)
- 最小生成树(Kruskal算法)
- Kruskal算法(求最小生成树)
- 最小生成树2(Kruskal算法)
- 最小生成树算法(2)------------Kruskal
- Kruskal 算法(最小生成树)
- 最小生成树算法[Prime/(Kruskal)]
- 最小生成树(二)...Kruskal算法
- kruskal最小生成树(MST)算法
- JS中的异步,以及如何异步
- Two Sum
- 堆排序 Java
- 类对象结构
- Composer实现PHP中类的自动加载
- 秦始皇修路,白书P345LA5713(最小生成树,Kruskal算法)
- linux内核kmalloc函数使用方法
- sci期刊发表医学论文注意哪些事项
- springmvc- 分页插件-<jsp:include >遇到问题
- make 2>&1 | tee make.out 命令解释
- 安吉之行
- ButterKnife的功能描述
- 解决ubuntu16.04安装cuda时出现E:无法定位软件包
- 打造新一代去中心化代币交易撮合协议,王东想实现代币交易新生态