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

HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4081

题目大意:

秦始皇要在n个城市之间修筑一条道路使得任意两个城市均可连通。有个道士可以用法力帮忙修一条路。秦始皇希望其他的道路总长B最短且用法术连接的两个城市的人口之和A尽量大,因此下令寻找一个A / B的最大方案。

思路:

先求出MST,然后枚举用法术修哪一条边。那么,法术修的边显然应该是MST中连接两个点 u ,v中最大的一条边。

所以对MST使用DFS,当访问一个新结点cur时候,考虑所有已经访问过的老结点x,更新f(x,u)=max( f(x,v) ,w(u,v) );其中v是u的老结点。

这样,枚举任意的两个城市,ans = max(ans, (p[i].num+p[j].num) / (mstlen - dp[i][j]));   p[i].num为城市i人数,mstlen为最小生成树的长度,dp[i][j]就是上面说的连接i 和j 最大的一条边。

下次直接用vector的了,好多的len什么的。。。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN=1000+10;
int n;
int p_len,e_len,len;//点的数目,各个点距离的数目,MST的邻接表边数,dfs的顶点数
int fa[MAXN],head[MAXN];
double dp[MAXN][MAXN],mstlen;
int find(int cur)
{
return cur==fa[cur]? cur : fa[cur]=find(fa[cur]);
}
struct point //记录各个城市的坐标和人口
{
int x,y;
int num;
}p[MAXN];
struct edge //化坐标为距离求MST
{
int from,to;
double dis;
bool operator<(const edge &x)const{
return dis<x.dis;
}
}e[MAXN*MAXN];
struct edge2 //MST邻接表
{
int to,next;
double val;
}e2[MAXN*2]; void add(int from,int to,double val)
{
e2[len].to=to;
e2[len].val=val;
e2[len].next=head[from];
head[from]=len++;
}
//当访问一个新结点cur时候,考虑所有已经访问过的老结点x,更新f(x,u)=max( f(x,v) ,w(u,v) );
//其中v是u的老结点。
vector<int> nodes;
void dfs(int cur,int fa,double dis)
{
for(int i = 0; i < nodes.size(); i++) {
int x = nodes[i];
dp[cur][x] = dp[x][cur] = max(dp[x][fa], dis);
}
nodes.push_back(cur);
for(int i=head[cur];i!=-1;i=e2[i].next)
{
int id=e2[i].to;
if(id != fa) dfs(id,cur,e2[i].val);
} }
//求MST,并且记录
void kruskal()
{
memset(head,-1,sizeof(head));
for(int i=0;i<n;i++)
fa[i]=i; int &len=e_len;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
e[len].from=i;
e[len].to=j;
e[len++].dis = sqrt( (double)(p[i].y-p[j].y)*(p[i].y-p[j].y)
+(double)(p[i].x-p[j].x)*(p[i].x-p[j].x) );
} int cnt=0;
mstlen=0;
sort(e,e+len);
for(int i=0;i<len;i++)
{
int x=e[i].from,y=e[i].to;
int root_x=find(x),root_y=find(y);
if(root_x==root_y) continue;
mstlen+=e[i].dis;
fa[root_x]=root_y;
add(x,y,e[i].dis); //建立MST的邻接表
add(y,x,e[i].dis);
if(++cnt > n-1) break;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
len=e_len=p_len=0;
memset(dp,0,sizeof(dp));
nodes.clear(); scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].num); kruskal(); 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].num+p[j].num) / (mstlen - dp[i][j]));
}
printf("%.2lf\n", ans);
}
return 0;
}

LA 5713 - Qin Shi Huang's National Road System(HDU 4081) MST的更多相关文章

  1. Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)

    Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...

  2. UValive 5713 Qin Shi Huang's National Road System

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

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

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

  4. UVALive 5713 Qin Shi Huang's National Road System(次小生成树)

    题意:对于已知的网络构建道路,使城市两两之间能够互相到达.其中一条道路是可以免费修建的,问需要修建的总长度B与免费修建的道路所连接的两城市的人口之和A的比值A/B最大是多少. 因为是求A/B的最大值, ...

  5. hdu 4081 Qin Shi Huang's National Road System (次小生成树)

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

  6. 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 ...

  7. HDU 4081 Qin Shi Huang's National Road System 次小生成树变种

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

  8. [hdu P4081] Qin Shi Huang’s National Road System

    [hdu P4081] Qin Shi Huang’s National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

  9. HDU4081 Qin Shi Huang's National Road System 2017-05-10 23:16 41人阅读 评论(0) 收藏

    Qin Shi Huang's National Road System                                                                 ...

随机推荐

  1. C#制作文本转换为声音的demo,保存音频文件到本地

    TTS(Text To Speech)可以实现把文本转换成语音并朗读出来.Windows Xp可以使用Com组件--Microsoft Speech Object Library实现TTS,Windo ...

  2. 配置远程访问阿里云服务器的Redis

    1.默认情况Redis不是在后台运行,我们需要修改把redis放在后台运行:daemonize yes 2.Redis安全策略默认本机访问,所以远程访问的话需要将 bind 127.0.0.1加#注释 ...

  3. Mysql主从级联复制

    场景1 如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点 通过备份恢复数据至从服务器· 复制起始位置为备份时,二进制日志文件及其POS: Mater 设置 1) 修改配置文件 ...

  4. c# for 和 foreach

    1给定长度 不需要计算长度的 for比foreach循环效率高 2 在不确定长度 或者计算长度有性能损耗的时候 用foreach比较方便 2336 循环语句是编程的基本语句,在C#中除了沿用C语言的循 ...

  5. XML学习总结(1)——XML入门

    一.XML语法学习 学习XML语法的目的就是编写XML 一个XML文件分为如下几部分内容: 文档声明 元素 属性 注释 CDATA区 .特殊字符 处理指令(processing instruction ...

  6. AIX中经常使用的SMIT 的使用

    AIX中经常使用的SMIT 的使用 1.  smit 的日志文件 (1)$HOME/smit.log      记录了所訪问的全部菜单.对话内容,所运行的命令和输出结果 在 SMIT 会话中出现的全部 ...

  7. softInputMode- 软件盘的设置

    今天遇到一个问题,就是软件盘弹出来以后,会把之前的布局界面整个的挤到屏幕的外面,而且按下返回建以后,这个软件盘占据的空间会留下一个黑色的背景.在网上查找了很多的方法,刚开始都是说,如下方法 <a ...

  8. eclipse- DDMS截图功能使用

    如何使用eclipse的截图功能呢 1.打开eclipse 2.连接手机 3.打开eclipse的DDMS插件. 4.选中手机 5.点击上面的摄像机图标,就可以截图了 如果你打开了DDMS以后,没有发 ...

  9. DNS Flood Detector让DNS更安全

    650) this.width=650;" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" ...

  10. Spring源码分析专题 —— IOC容器启动过程(上篇)

    声明 1.建议先阅读<Spring源码分析专题 -- 阅读指引> 2.强烈建议阅读过程中要参照调用过程图,每篇都有其对应的调用过程图 3.写文不易,转载请标明出处 前言 关于 IOC 容器 ...