首页 > 其他分享 >HDU4801——思维,生成树(口糊)

HDU4801——思维,生成树(口糊)

时间:2022-12-13 23:36:01浏览次数:56  
标签:口糊 ld HDU4801 思维 int double cnt mp ans

//题意:有坐标图上有N个点,每个点有一个收益,要求修n-1条路联通所有点。现在有一个免单机会 ,即免除一条路的花费,求 max(免除花费的路的两端点的收益和/n-1条路的总花费)
//思路:首先不考虑那条边,我们要使得花费最小,肯定需要求一个最小生成树,然后我们进行枚举遍历求最大值,如果枚举到的边使最小生成树的边,那么直接 sum/MST-该边权值 即可
// 如果不是的话,我们需要 sum/MST-(该边的两个端点在最小生成树中连出去的边的最大值)即可
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1010;
struct pt {
int x, y, w;
}mp[N];
struct edge {
int x, y; double w;
bool operator <(const edge& temp)const {
return w < temp.w;
}
}ld[N * N];
int T, n, cnt;
int fa[N];
int find(int x) {
if (fa[x] == x) return x;
return fa[x] = find(fa[x]);
}
int con[N][N];
bool use[N * N];
vector<int> op[N];
double kruskal() {
sort(ld + 1, ld + 1 + cnt);
int ct = n; double ans = 0;
for (int i = 1; i <= cnt; i++) {
int a = find(ld[i].x), b = find(ld[i].y);
if (a != b) {
use[i] = true;
con[a][b] = i;//最小生成树边
op[a].push_back(i); op[b].push_back(i);
ans += ld[i].w;
fa[a] = b;
ct--;
}
if (ct == 1) break;
}
return ans;
}
int main() {
cin >> T;
while (T--) {
cnt = 0;
for (int i = 1; i <= N; i++) fa[i] = i;
memset(use, false, sizeof(use));
for (int i = 1; i <= N; i++) op[i].clear();
cin >> n;
for (int i = 1; i <= n; i++) cin >> mp[i].x >> mp[i].y >> mp[i].w;
for (int i = 1; i < n; i++) {
for (int j = i + 1; j <= n; j++) {
ld[++cnt].w = sqrt((mp[i].x - mp[j].x) * (mp[i].x - mp[j].x) + (mp[i].y - mp[j].y) * (mp[i].y - mp[j].y));
ld[cnt].x = i, ld[cnt].y = j;
}
}
double temp = kruskal();
double ans = -1;
for (int i = 1; i <= cnt; i++) {
if (use[i])
ans = max(ans, (mp[ld[i].x].w + mp[ld[i].y].w) / (temp - ld[con[ld[i].x][ld[i].y]].w));
else {
double mess = -1;
for (auto wt : op[ld[i].x]) mess = max(mess, ld[wt].w);
for (auto wt : op[ld[i].y]) mess = max(mess, ld[wt].w);
ans = max(ans, (mp[ld[i].x].w + mp[ld[i].y].w) / (temp - mess));
}
}
printf("%.2lf\n", ans);
}
return 0;
}//以上代码随便糊的

标签:口糊,ld,HDU4801,思维,int,double,cnt,mp,ans
From: https://www.cnblogs.com/Aacaod/p/16980972.html

相关文章

  • P2431 正妹吃月饼——进制思维题
    正妹吃月饼题目描述今天是中秋节。uim带来了一堆大小不同且味道各异的月饼。这些月饼的质量分别是1g,2g,4g,8g,16g....后面一个是前面的2倍。每种只有一个。uim让正......
  • 结构化思维:轻松解决一句话需求
    当领导抛出“一句话需求”时,你的状态是如何?是懵逼还是奔溃?还是有很多需要问的但却不知如何问起?本文破攻“一句话需求”,用结构化思维拆解需求,提高沟通的效率和质量,获取自己......
  • 剑指offer 数据流中的中位数(思维,堆)
    题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值......
  • 剑指offer 字符流中第一个不重复的字符(思维,队列)
    题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“g......
  • 剑指offer 对称的二叉树(思维)
    题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路:正规的解法是传入两个节点,然后判断它们是不......
  • Flink 面试指南 | 终于要跟大家见面了,我有点紧张。(附思维导图)
    面试,一个令人大多数同学头疼的问题,要么成功进入心仪公司,要么沮丧与其失之交臂。但是,如果能在面试前就能知道面试官将会问的问题,然后可以好好提前准备,这种感觉是不是特别棒?之......
  • 思维
    https://codeforces.com/gym/102059/problem/G题意:一条街上一共N个点,需要在某些点上建路灯,使得整条街被照亮,一个路灯可以照亮左右两个点,每个点都有一个建路灯的花费。......
  • c#winform工作流程图 GDI+连线 原生代码不使用任何插件 流程图、思维导图、顺序流程图
    支持节点流向、逆流支持更改节点颜色支持更改节点大小支持节点指向多个节点支持导出json文件支持导入json文件支持一键清空支持拓展到其他项目的二次开发支持选中......
  • 技术管理思维导图V0.0.1
    ......
  • 学生 =》 打工人 思维的转变
    工作是来解决问题的工作总体的进度是我们的目标个人有问题的时候快速暴露自己的问题,多问多总结,痛苦疲惫的睡去证明你学到东西了问、学习不要怕丢人。一句话,为了解决问......