先求出最小生成树,然后枚举树上的边,对于每条边“分别”找出这条割边形成的两个块中点权最大的两个

1.因为结果是A/B。A的变化会引起B的变化,两个制约。无法直接贪心出最大的A/B。故要通过枚举

2.无论magic road要加在哪里。加的边是否是最小生成树上的边,都会产生环,我们都要选择一条边删掉

注意删掉的边必须是树的环上的边。为了使结果最大。即找出最大的边

3.能够枚举两点。找出边,也能够枚举边,找出点,我是用后者。感觉比較easy写也好理解

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
const int INF=(1<<31)-1;
int num;
bool visit[1111];
struct city{int x,y,popu;}point[1111];
vector<int>G[1111];
double getdis(city& a,city& b)
{
double dx=a.x-b.x;
double dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
double dis[1111][1111];
double prim()
{
double sum=0;
double dist[1111];
fill(dist,dist+1111,INF*1.0);
double minedge=INF;
int now=1,min_p;
int pre[1111];
memset(pre,0,sizeof(pre));
dist[now]=0;
visit[1]=true;
for(int t=1;t<num;t++)
{
for(int i=1;i<=num;i++)
{
if(i!=now && !visit[i] &&dist[i]>dis[now][i])
{
pre[i]=now;
dist[i]=dis[now][i];
}
}
minedge=INF;
for(int i=1;i<=num;i++)
{
if(!visit[i]&&minedge>dist[i])
{
minedge=dist[i];
min_p=i;
}
}
G[pre[min_p]].push_back(min_p);
G[min_p].push_back(pre[min_p]);
sum+=dis[min_p][pre[min_p]];
now=min_p;
visit[now]=true;
}
return sum;
}
int dfs(int v,int fa)
{
int maxn=point[v].popu;
for(int j=0;j<G[v].size();j++)
{
if(G[v][j]!=fa)
{
maxn=max(maxn,dfs(G[v][j],v));
}
}
return maxn;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("G:/1.txt","r",stdin);
freopen("G:/2.txt","w",stdout);
#endif
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&num);
for(int i=1;i<=num;i++)
{
scanf("%d%d%d",&point[i].x,&point[i].y,&point[i].popu);
}
for(int i=1;i<=num;i++)
{
for(int j=1;j<=num;j++)
{
dis[i][j]=getdis(point[i],point[j]);
}
}
double sum=prim();
double ans=0;
for(int i=1;i<=num;i++)
{
for(int j=0;j<G[i].size();j++)
{
int t1=dfs(i,G[i][j]);
int t2=dfs(G[i][j],i);
ans=max(ans,(t1+t2)*1.0/(sum-dis[i][G[i][j]]));
}
}
//ans+=(1e-8);
printf("%.2f\n",ans);
for(int i=1;i<=num;i++)
{
G[i].clear();
}
memset(point,0,sizeof(city)*(num+1));
memset(visit,0,sizeof(bool)*(num+1));
}
}

HDU4081 Qin Shi Huang&#39;s National Road System【prim最小生成树+枚举】的更多相关文章

  1. HDU 4081 Qin Shi Huang&#39;s National Road System 最小生成树

    点击打开链接题目链接 Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  2. HDU 4081 Qin Shi Huang&#39;s National Road System(最小生成树/次小生成树)

    题目链接:传送门 题意: 有n坐城市,知道每坐城市的坐标和人口.如今要在全部城市之间修路,保证每一个城市都能相连,而且保证A/B 最大.全部路径的花费和最小,A是某条路i两端城市人口的和,B表示除路i ...

  3. HDU4081 Qin Shi Huang's National Road System —— 次小生成树变形

    题目链接:https://vjudge.net/problem/HDU-4081 Qin Shi Huang's National Road System Time Limit: 2000/1000 ...

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

    Qin Shi Huang's National Road System                                                                 ...

  5. HDU4081: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(最小生成树+bfs)

    题目链接: Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: ...

  7. HDU4081 Qin Shi Huang's National Road System(次小生成树)

    枚举作为magic road的边,然后求出A/B. A/B得在大概O(1)的时间复杂度求出,关键是B,B是包含magic road的最小生成树. 这么求得: 先在原图求MST,边总和记为s,顺便求出M ...

  8. hdu4081 Qin Shi Huang's National Road System 次小生成树

    先发发牢骚:图论500题上说这题是最小生成树+DFS,网上搜题解也有人这么做.但是其实就是次小生成树.次小生成树完全当模版题.其中有一个小细节没注意,导致我几个小时一直在找错.有了模版要会用模版,然后 ...

  9. HDU4081 Qin Shi Huang's National Road System

    先求最小生成树 再遍历每一对顶点,如果该顶点之间的边属于最小生成树,则剪掉这对顶点在最小生成树里的最长路径 否则直接剪掉连接这对顶点的边~ 用prim算法求最小生成树最长路径的模板~ #include ...

随机推荐

  1. Git使用教程(全)

    Git是什么? Git是目前世界上最先进的开源的分布式版本控制系统(没有之一),用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开 ...

  2. getAttribure()和getParameter()的区别

    1.getAttribute是取得jsp中 用setAttribute设定的attribute 2.parameter得到的是string:attribute得到的是object 3.request. ...

  3. WebService注解

    package cn.itcast.service; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.W ...

  4. C++多态有哪几种方式?

    C++多态方式: (1)静态多态(重载,模板) 是在编译的时候,就确定调用函数的类型. (2)动态多态(覆盖,虚函数实现) 在运行的时候,才确定调用的是哪个函数,动态绑定.运行基类指针指向派生类的对象 ...

  5. mysql create dabase 语法详解

    由于SQL标准的存在,各个关系型数据库管理系统中创建库的语句都差不多 一.mysql 中创建数据库的语法如下: 1.创建数据库的语法: create {database | schema } [if ...

  6. ui-router(三)controller与template

    这篇就是在以前的基础上,把客户端angular.js 负责的部分整体串起来演示一下. 我们按照angular执行顺序来做前提准备: (1)Client 根目录下 index.html 首先加载angu ...

  7. Android 使用PLDroidPlayer播放网络视频 依据视频角度自己主动旋转

    近期由于项目需求 .须要播放网络视频 .于是乎 研究了一番 ,说说我遇到的那些坑 如今市面上有几个比較主流好用的第三方框架 Vitamio ( 体积比較大,有商业化风险 github:https:// ...

  8. find_if查找vector内对象的成员 作为菜鸟一直不会用也不敢用

    用stl的find方法查找一个包含简单类型的vector中的元素是很简单的,例如 vector<string> strVec; find(strVec.begin(),strVec.end ...

  9. C++知识点 笔试常见

    C++知识点   一.#include “filename.h”和#include <filename.h>的区别 #include “filename.h”是指编译器将从当前工作目录上开 ...

  10. 安卓开发学习2-官方例子Accelerometer

    1.使用WakeLock防止屏幕被锁住,如果用户自己锁住屏幕,下次再开的时候还会重置一下,防止被锁. 2.SimulationView接收传感器事件,并且绘制.它实现SensorEventListen ...