题目链接:http://vjudge.net/contest/144221#problem/A

题意:

秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通。道士徐福声称他可以用法术修路,不花钱,也不用劳动力,但只能修一条路,因此需要慎重选择用法术修哪一条路。秦始皇不仅希望其他道路的总长度B尽量短(这样可以节省劳动力),还希望法术连接的两个城市的人口之和A尽量大,因此下令寻找一个使得A/B最大的方案。你的任务是找到这个方案。

任意两个城市之间都可以修路,长度为两个城市之间的欧几里德距离。

分析:肯定是在最小生成树中删边,使得其他道路尽量短,又是添加哪两个点,使得人口最多。

就要枚举这两个点了,注意,架起来的桥,不一定是一定要删这两个点的边,而是,这两个点之间的路上的最大边。这样枚举就可以了。

那么就是要求每两个点之间的最大权了。(⊙o⊙),这个dfs太精妙了,我想了好久,记录一下思想。

maxcost(i,j)点 i 和 j 之间的路里面的最大权,那么,

他等于是,他的新边,和之前的祖先的最优值。

#include <bits/stdc++.h>
using namespace std; const int maxn = + ; struct Edge
{
int u,v;
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]; vector<int> G[maxn];
vector<double> C[maxn];
int father[maxn]; int Find_Set(int x)
{
if(x!=father[x])
father[x] = Find_Set(father[x]);
return father[x];
} double MST()
{
int m = ;
for(int i=; i<n; i++)
{
for(int j=i+; 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=; i<n; i++)
{
father[i] = i;
G[i].clear();
C[i].clear();
}
int cnt = ;
double ans = ; for(int i=; i<m; i++)
{
int x = e[i].u;
int y = e[i].v;
int fx = Find_Set(x);
int fy = Find_Set(y); double d = e[i].d;
if(fx!=fy)
{
father[fx] = fy;
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-) break;
}
}
return ans;
} double maxcost[maxn][maxn];
vector<int> nodes; // 0 -1 0
void dfs(int u, int fa, double facost)
{
for(int i = ; 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 = ; 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=; i<n; i++)
scanf("%d%d%d",&x[i],&y[i],&p[i]);
double tot = MST(); memset(maxcost,,sizeof(maxcost));
nodes.clear();
dfs(, -, ); double ans = -; for(int i=; i<n; i++)
{
for(int j=i+; j<n; j++)
{
ans = max(ans,(p[i]+p[j])/(tot-maxcost[i][j]));
}
}
printf("%.2lf\n",ans);
} return ;
}

LA 5713 秦始皇修路 MST的更多相关文章

  1. LA 5713 秦始皇修路

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

  2. hdu4081 秦始皇修路(次小生成树)

    题目ID:hdu4081   秦始皇修路 题目链接:点击打开链接 题目大意:给你若干个坐标,每个坐标表示一个城市,每个城市有若干个人,现在要修路,即建一个生成树,然后有一个魔法师可以免费造路(不消耗人 ...

  3. UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)

    题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...

  4. LA5713 秦始皇修路 (mst)

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

  5. LA 5713 - Qin Shi Huang's National Road System(HDU 4081) MST

    LA:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  6. 【LA 5713 】 Qin Shi Huang's National Road System (MST)

    [题意] 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B ...

  7. 【最小生成树】UVA1494Qin Shi Huang's National Road System秦始皇修路

    Description During the Warring States Period of ancient China(476 BC to 221 BC), there were seven ki ...

  8. UVALive - 5713 最小生成树

    题意: 秦始皇修路,已知n个城市的坐标以及该城市的人口数,修路的费用是两个城市之间的欧几里得距离,其中可以有一条路不用花费代价但是要求这条路连接的两个城市的人口之和A/B尽量大,其中B是修路的总费用. ...

  9. 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. QStriingList

    #include <QCoreApplication> #include<QDebug> #include<QStringList> int main(int ar ...

  2. maven配置

    java 环境变理 http://jingyan.baidu.com/article/f96699bb8b38e0894e3c1bef.html maven环境变理 http://www.cnblog ...

  3. ACM集训的第。。。诶~不知道第几题=.=

    题目: 郭铮鹏认为排序是一种很频繁的计算任务,所以他考虑了一个简单的问题:现在最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候.在这个任务中可能的值只有三种1,2 ...

  4. 如何整合最新的Flex sdk和Air sdk。

    使用Flex来开发air应用,如果想使用最新sdk的话,配置起来还真是一个麻烦事儿. Flex捐给apache维护了,air还是adobe自己维护,那么就得分别到这两边下载最新的sdk然后自己整合起来 ...

  5. matlab备忘录

    1.使用运算符‘:’将矩阵的所有列拼成一列 2..'与'操作差别在复数运算时,'是复共轭转置,.'是转置 3.读取文件夹下的某类型文件 img_dir = dir('*.tif'); img_dir ...

  6. iOS 面试题(三):为什么 weakSelf 需要配合 strong self 使用 --转自唐巧

    问题 继续回答昨天的问题第二问. 我们知道,在使用 block 的时候,为了避免产生循环引用,通常需要使用 weakSelf 与 strongSelf,写下面这样的代码: __weak typeof( ...

  7. android获取textview的行数

    最近项目需求,需要获取Textview的行数,通过行数与TextView的maxLines进行比较来确定是否显示TextView下方的展开按钮是否显示,废话少说直接上代码,mTextView.getL ...

  8. Android 自定义spinner下拉框实现

    一:前言本人参考博客:http://blog.csdn.net/jdsjlzx/article/details/41316417 最近在弄一个下拉框,发现Android自带的很难实现我的功能,于是去网 ...

  9. SpringMVC常用配置-Controller返回格式化数据如JSON、XML的配置方式和机制

  10. ios 三种对话框拉伸方法