HDU 4081(转自YouthDance的CSDN博客)
来源:互联网 发布:excel数据标签 编辑:程序博客网 时间:2024/06/04 19:38
Qin Shi Huang's National Road System
题目链接:Click Here~
题目重述:
题目说秦始皇要修路,把N个城市用N-1条边连通。且他希望花费最小,但是这时候有一个多管闲事的道士出来说他有魔法可以帮助秦始皇变成一条路,但是只能变出一条。但是,两个人对修路的法案存在歧义,道士希望修路可以给更多的百姓带来福利,而秦始皇希望修路要尽量使花费小。最后,秦始皇拿出了一个公式A/B,A表示两个城市的人数,B表示出了用魔法变出来的路外,最短的总距离。现在要你求出A/B的最大值。
思路分析:
从题目可以看出是一个此小生成树问题,但是也有人有DP AC了。具体思路就看网上别人的解释吧。
- #include <iostream>
- #include <algorithm>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- using namespace std;
- const int N = 1e3 + 5;
- int n,m;
- double path[N][N],G[N][N];
- bool used[N][N],hash[N];
- struct Point
- {
- double x,y,cost;
- }p[N];
- double Dist(Point a,Point b)
- {
- return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
- }
- double Prim()
- {
- int pre[N];
- double sum = 0,mincost[N];
- memset(hash,0,sizeof(hash));
- memset(used,0,sizeof(used));
- memset(path,0,sizeof(path));
- hash[1] = 1;
- for(int i = 1;i <= n;++i){
- mincost[i] = G[1][i];
- pre[i] = 1;
- }
- for(int i = 1;i < n;++i)
- {
- int u = -1;
- for(int j = 1;j <= n;++j)if(!hash[j]){
- if(u == -1||mincost[j] < mincost[u])
- u = j;
- }
- hash[u] = 1;
- used[u][pre[u]] = used[pre[u]][u] = 1; //判断两点之间是否在生成树中
- sum += G[pre[u]][u];
- for(int j = 1;j <= n;++j)
- {
- if(hash[j]&&u != j){
- path[j][u] = path[u][j] = max(mincost[u],path[j][pre[u]]); //生成树中的最大权值
- // path[j][u] = path[u][j] = mincost[u];
- }
- if(!hash[j]){
- if(mincost[j] > G[u][j]){
- mincost[j] = G[u][j];
- pre[j] = u;
- }
- }
- }
- }
- return sum;
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d",&n);
- for(int i = 1;i <= n;++i){
- scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].cost);
- }
- memset(G,0,sizeof(G));
- for(int i = 1;i <= n;++i)
- for(int j = i+1;j <= n;++j){
- G[i][j] = G[j][i] = Dist(p[i],p[j]);
- }
- double mincost = Prim();
- double ratio = -1;
- for(int i = 1;i <= n;++i)
- for(int j = 1;j <= n;++j)
- printf("path[%d][%d] = %lf\n",i,j,path[i][j]);
- for(int i = 1;i <= n;++i)
- for(int j = i+1;j <= n;++j){
- if(used[i][j]){
- ratio = max(ratio,(p[i].cost+p[j].cost)/(mincost-G[i][j]));
- }else
- { //删除生成树中的最大的一条边,生成一个类此小生成树(因为,不是严格的此小生成树)
- ratio = max(ratio,(p[i].cost+p[j].cost)/(mincost-path[i][j]));
- }
- }
- printf("%.2lf\n",ratio);
- }
- return 0;
- }
0 0
- HDU 4081(转自YouthDance的CSDN博客)
- 我的学习方法 -转自csdn博客
- 学习java的30个目标(转自csdn博客)
- Linux音频子系统-转自droidphone的CSDN博客
- ICMP报文协议(转自CSDN tigerjb博客)
- vmstat命令详解(转自csdn博客)
- Volley用法解析四(从源码角度理解Volley)(转自郭霖大神的CSDN博客)
- 三种高效率SQL语句分页方法(2)--转自CSDN中WUCF2004的博客
- glBlendFunc()的参数(转自CSDN)
- glBlendFunc()的参数(转自CSDN)
- glBlendFunc()的参数(转自CSDN)
- LruCache加载图片(转载自郭霖郭大神的CSDN博客)
- (转自csdn文章)iPhone系列开发博客资源汇总
- ZT:架构师已死(转自UML软件工程组织) - 我一路走来--- - 博客频道 - CSDN.NET
- 0 欢迎使用CSDN-markdown编辑器(博客自带)
- 关于.NET的委托(转自jianbao的博客)
- HDU 2222 Keywords Search 转自:kuangbin博客园
- HDU部分题目算法归纳(转自http://blog.csdn.net/lizuqingblog/article/details/17392941)
- Android 深入研究JNI详解
- 题目问答
- priority_queue的用法
- odb2.3 centos上编译、测试
- Tomcat 缓存jsp的问题
- HDU 4081(转自YouthDance的CSDN博客)
- 多线程(c++11)------创建线程
- CodeForces 404E Maze 1D
- RS232、RS422、RS485、TTL电平
- c++11学习笔记之智能指针
- 实参数组和形参数组在存储空间上完全重合
- 使用LruCache的代码整理
- MONGODB 数据的存储顺序发现不是按_ID 的顺序存储的原因
- perl的列表与数组(转)