题意:有n个(n<=1000)城市,坐标都告诉你了,并且每个城市都有人居住,现在要修路n-1条路,使得每个城市都连通。显然,这就是一颗树。当然,边的权值就是两点的距离。条件:有一条边可以不用任何花费。问这条边的两端点的总人数/(包含这条边的最小生成树的总权值-这条边的权值)最大是多少。即(Wa+Wb)/(mst-w(a,b))最大。
解:其实这题是次小生成树的变形。首先可以想到最小生成树。但最小生成树的边集中的不一定是最大的。考虑n只有10^3,可以枚举两点再求。
枚举的时候,判断这条边在不在MST上,若在,直接求。若不在呢?是不是类似于次小生成树了?是的。添加这条边后,就会形成环,删去环中第二大的边(分母最小),即MST中从a到b的最大边,再求。记录最大值即可。
复杂度=求最小生成树的复杂度+边数。可惜没去现场赛。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
const int maxv = 1010;
const int maxe = maxv*maxv;
int n;
int p[maxv];
double Max[maxv][maxv];
int pos[maxv][2],peo[maxv];
struct Edge //原始图
{
int from;
int to;
double w;
bool flag;
}e[maxe];
int m;
struct Tree //最小生成树
{
int to;
double w;
int next;
}tree[maxv*2];
int head[maxv],num;
struct Node //生成树的结点
{
int seq; //结点编号
double max; //从某个点到它的路径中的最大边的长度
};
bool cmp(const Edge &a, const Edge &b)
{
return a.w < b.w;
}
void makeSet()
{
for(int i = 0; i <= n; i++)
{
p[i] = i;
}
}
int findSet(int x)
{
if(x != p[x])
p[x] = findSet(p[x]);
return p[x];
}
void addEdge(int from, int to, double w)
{
tree[num].to = to;
tree[num].w = w;
tree[num].next = head[from];
head[from] = num++;
}
void addEdge2(int from, int to, double w)
{
e[m].to = to;
e[m].from = from;
e[m].w = w;
e[m].flag = false;
m++;
}
double kruscal()
{
int i;
int x, y;
int edgeNum = 0;
double result = 0;
makeSet();
sort(e,e+m,cmp);
for(i = 0; i < m; i++)
{
x = findSet(e[i].from);
y = findSet(e[i].to);
if(x != y)
{
edgeNum++;
addEdge(e[i].from,e[i].to,e[i].w);
addEdge(e[i].to,e[i].from,e[i].w);
e[i].flag = true;
p[x] = y;
result += e[i].w;
}
}
return edgeNum == n-1 ? result : -1;
}
void bfs(int p)
{
bool used[maxv];
memset(used,0,sizeof(used));
queue<Node> que;
Node now,adj;
now.max = 0;
now.seq = p;
que.push(now);
used[p] = true;
while(!que.empty())
{
Node q = que.front();
que.pop();
for(int i = head[q.seq]; i != -1; i = tree[i].next)
{
adj.seq = tree[i].to;
adj.max = tree[i].w;
if(!used[adj.seq])
{
if(q.max > adj.max)
adj.max = q.max;
Max[p][adj.seq] = adj.max;
used[adj.seq] = true;
que.push(adj);
}
}
}
}
double second_MST()
{
int i;
double mst = kruscal();
for(i = 1; i <= n; i++)
bfs(i);
double ans = -1.0;
for(i = 0; i < m; i++)
{
double tmpt;
if(!e[i].flag)
tmpt = (peo[e[i].from]+peo[e[i].to])*1.0/(mst-Max[e[i].from][e[i].to]);
else
tmpt = (peo[e[i].from]+peo[e[i].to])*1.0/(mst-e[i].w);
if(ans < tmpt)
ans = tmpt;
}
return ans;
}
double dis(int i, int j)
{
return sqrt((pos[i][0]-pos[j][0])*(pos[i][0]-pos[j][0])*1.0+(pos[i][1]-pos[j][1])*(pos[i][1]-pos[j][1]));
}
int main()
{
int i,j;
int cases;
scanf("%d",&cases);
while(cases--)
{
scanf("%d",&n);
m = num = 0;
memset(head,-1,sizeof(head));
for(i = 1; i <= n; i++)
scanf("%d %d %d",&pos[i][0],&pos[i][1],&peo[i]);
for(i = 1; i <= n; i++)
{
for(j = i+1; j <= n; j++)
{
double t = dis(i,j);
addEdge2(i,j,t);
}
}
printf("%.2lf\n",second_MST());
}
return 0;
}
分享到:
相关推荐
根据提供的文件信息,我们可以深入探讨WinCC_V7.0 SP3 AISA的相关知识点,包括其版本更新、功能特性以及在工业自动化领域的应用等。 ### WinCC V7.0 SP3 AISA简介 #### 1. **WinCC V7.0概述** - **背景与定位**:...
3D-aisa.zip,a is a是一个用typescript编写的软件3d引擎。,3D建模使用专门的软件来创建物理对象的数字模型。它是3D计算机图形的一个方面,用于视频游戏,3D打印和VR,以及其他应用程序。
贾鹤鸣等人提出了一种名为AISA-SMA-FCM的自适应优化算法,该算法结合了AISA和SMA的优点。首先,他们引入AISA的社会机制来改进SMA的全局搜索和局部开发性能,以克服SMA在处理复杂数据时的局限性。接着,将AISA-SMA...
航天“Aisa”高能离子空气净化系统介绍.pptx
AISA is a Software 3D Engine written in TypeScript. The only prerequisite for AISA to run properly is a HTML5 compatible web browser and a fast CPU (as you can guess JavaScript is not as fast as ...
Aisa, é uma obra valiosa para desenvolvedores que desejam aprofundar seus conhecimentos sobre os conceitos fundamentais e as melhores práticas na aplicação de padrões de projeto em sua programaç...
- A:在某些情况下,WINCC V7.0 SP3可以兼容旧版本的数据和项目文件,但最好事先进行测试以确保兼容性。 ##### Q3:如何解决安装过程中遇到的问题? - A:如果在安装过程中遇到问题,可以参考官方文档中的故障排除...
酷红V4 重新编码SC:Nurutomo 笔记 : JANGAN UBAH NAMA BOT BIAR BOTNYA GAK RUSAK! 对于TERMUX用户 > pkg update && pkg upgrade > pkg install git -y > pkg install nodejs -y > pkg install ffmpeg -y ...
工具 360Safe
### 《Asia Conserved》:文化遗产保护的宝贵经验 #### 一、背景介绍与意义 《Asia Conserved》是一本由联合国教科文组织(UNESCO)曼谷亚太办事处出版的书籍,它记录了2000年至2004年间在亚太地区实施的文化遗产...
此文档针对WENCC V7.0的安装方法与授权方法,并含有具体学习网址
wincc共享资源,希望在工作上可以帮到你。
- AINT0001:记帐资产时的扩展检查 - AISA0001:分配库存号 - ATP00001:有效检查的用户出口 每个用户出口都有其特定的用途,根据业务需求选择合适的出口进行定制化开发。要成功利用这些用户出口,需要具备 ABAP/4 ...
然后,选择坐标系统为 Aisa,China HongKong1980 Grid,单位为 kilometers。 第二步:新建路网层 在 TransCAD 中,新建路网层可以通过 New - Geographic File 选择 Line Geographic File 来实现。在这里,我们...
使用`docker ps -a`检查容器是否已启动。成功启动后,可以通过浏览器访问Nextcloud,URL通常是`http://localhost`。 6. **初始化NextCloud**: 首次访问NextCloud时,系统会引导你进行初始化设置,包括管理员...
wincc7.0 SP2亚洲版安装注意事项及破解。
DevSecOps:将PT应用程序检查器实施到产品管道和运营中注意力! 这是DevOps工程师的非官方文档。 在这里,您将找到推荐的服务器...Media / ptaiee_adminguide_ru.pdf)内容使用AISA的工作算法用于发送项目以扫描到AI的
11. **总结与结论**:“in a word, there`re lots of people will go the the Aisa”表明总结和提炼关键点的重要性。在PPT末尾总结要点,强化观众记忆。 综上所述,创建一个经典稳重的PPT模板需要综合考虑设计美学...
wincc7.3 crack 破解 ,,工程实践,,本人购买,,