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 ...
随机推荐
- 什么时候用button,什么时候用a标签
什么时候用button,什么时候用a标签 一.问题 能实现链接功能的标签一般就a标签,button标签,input submit标签 input submit肯定是提交表单的时候用 那什么时候用but ...
- channels
package main import ( "fmt" "time" "strconv") func pinger(c chan strin ...
- Linux编译ffmpeg
Linux编译ffmpeg并转换MP3到AMR AMR格式是智能手机上的常用音频文件格式,比如MP3格式的压缩比大,但是文件比MP3小,所以在移动互联项目中应用比较广泛.去年年底协助联想研究院开发一款 ...
- 洛谷 P2242 公路维修问题
P2242 公路维修问题 题目描述 由于长期没有得到维修,A国的高速公路上出现了N个坑.为了尽快填补好这N个坑,A国决定对M处地段采取交通管制.为了求解方便,假设A国的高速公路只有一条,而且是笔直的. ...
- 洛谷 P3385 【模板】负环
P3385 [模板]负环 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M ...
- C++怎么访问私有变量和函数
用指针呀,了解C++内存结构的话. 1. 对于私有成员变量,可以用指针来访问. 2. 对于虚函数,也可以用指针来访问. 3. 另外,对于私有成员,如果摸不准地址构造,可以先构造一个结构相似的类,然后增 ...
- HTTP (httpwebrequest)
1.GET请求: public static string Get(string url) { string buffer = ""; try { HttpWebRequest r ...
- pat(A) 2-06. 数列求和(模拟摆竖式相加)
1.链接:http://www.patest.cn/contests/ds/2-06 2.思路:模拟摆竖式相加,因为同样位置上的数字同样,那么同一位上的加法就能够用乘法来表示 3.代码: #inclu ...
- 小胖说事29-----iOS中Navigation中左滑pop页面的三种方法
第三中类型.自己定义任何位置返回页面的方式,上边的类就是.m,大家能够贴过去使用.这个类是继承NavigationController的.用这个类初始化rootController就能够了.这里还有源 ...
- 批量删除Windows7中隧道适配器的方法
批量删除Windows7中隧道适配器的方法 1.在网卡属性的"网络"中,将"Internet协议版本(TCP/IPv6)"前面的勾去掉. 2.在CMD下分别执行 ...