LA 5713 - Qin Shi Huang's National Road System(HDU 4081) MST
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的更多相关文章
- Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)
Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...
- 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 ...
- UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)
题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...
- UVALive 5713 Qin Shi Huang's National Road System(次小生成树)
题意:对于已知的网络构建道路,使城市两两之间能够互相到达.其中一条道路是可以免费修建的,问需要修建的总长度B与免费修建的道路所连接的两城市的人口之和A的比值A/B最大是多少. 因为是求A/B的最大值, ...
- 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 ...
- 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 ...
- 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 ...
- [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 ...
- HDU4081 Qin Shi Huang's National Road System 2017-05-10 23:16 41人阅读 评论(0) 收藏
Qin Shi Huang's National Road System ...
随机推荐
- iOS8 对开发人员来说意味着什么?
今天凌晨.Apple WWDC2014 iOS8 正式推出. 或许,对于广大iOS用户来说,iOS8的创新并非特别多. 但对于开发人员来说,影响却将会是无比巨大的! 正如Apple官网上的广告:Hug ...
- [欧拉回路] poj 1386 Play on Words
题目链接: http://poj.org/problem?id=1386 Play on Words Time Limit: 1000MS Memory Limit: 10000K Total S ...
- C#中结构struct的使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 程序中为什么会使用while(0)
https://blog.csdn.net/u012062760/article/details/46446207 关于while(0)实际上是用来宏定义的,这样的宏定义可以避免调用的时候出错. 如下 ...
- Java证书通信
一.概念介绍: 加密是将数据资料加密,使得非法用户即使取得加密过的资料,也无法获取正确的资料内容,所以数据加密可以保护数据,防止监听攻击.其重点在于数据的安全性.身份认证是用来判断某个身份的真实性 ...
- arping---发送arp请求到一个相邻主机
arping命令是用于发送arp请求到一个相邻主机的工具,arping使用arp数据包,通过ping命令检查设备上的硬件地址.能够测试一个ip地址是否是在网络上已经被使用,并能够获取更多设备信息.功能 ...
- asp.net core系列 39 Razor 介绍与详细示例
原文:asp.net core系列 39 Razor 介绍与详细示例 一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor ...
- 例说linux内核与应用数据通信(四):映射设备内核空间到用户态
[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流,请勿用于商业用途] 一个进程的内存映象由以下几部分组成:代码段.数据段.BSS段和 ...
- C++ 为什么要virtual析构函数
class A { public: A() { printf("A()\n"); } virtual ~A() { printf("~A()\n"); } }; ...
- 18.C语言多线程总结
创建一个线程 _beginthread(myfun, , NULL);//返回值是一个HANDLE hd[i] = CreateThread(NULL, , add, NULL, , NULL);// ...