P3199 【[HNOI2009]最小圈】

news/2025/2/6 0:11:10/

疑似三倍经验

因为和机房一些大佬一起做的这道题,所以emmm他们貌似也写了题解,在做这道题的时候也参照了其他大佬写的一些题解,所以如果程序有雷同请见谅(手动鞠躬)


题目也是莫名其妙地给了一大串数学式,简洁地重新说一下题目

给你一张图,图中有环,定义一个环的平均值为环的边权和÷环中点的个数,那么就应该有了一中非常暴力的思路

  • 想办法找出来图中所有的环并求出其平均值,再比较出最小值

这个方法确实怎么想都很暴力,但是一点也不好实现,可能是我太弱,我实在想不太出来有什么算法可以找出来所有的环,所以这种思路先给我PASS掉

而正解呢?应该是二分答案。为什么?

  • 既然我们找不出来环,我们逆向思维,直接枚举平均值,看是否会有一个环符合条件,那么这道题就变成了:二分枚举平均值,找到是否有环符合条件

若我们此时枚举的平均值为 a n s ans ans,有 k k k个字符串,那么就有

a n s ∗ k = l e n 1 + l e n 2 + l e n 3 + . . . + l e n k ans * k = len1 + len2 + len3 + ... + lenk ansk=len1+len2+len3+...+lenk

那道这个式子之后,我们对它进行移项

0 = l e n 1 − a n s + l e n 2 − a n s + l e n 3 − a n s + . . . + l e n k − a n s 0=len1-ans+len2-ans+len3-ans+...+lenk-ans 0=len1ans+len2ans+len3ans+...+lenkans

那么对于满足以下式子,就可以判断是环了,所以在跑 S P F A SPFA SPFA更新距离的时候,就应该像下面这样

0 ≤ l e n 1 − a n s + l e n 2 − a n s + l e n 3 − a n s + . . . + l e n k − a n s 0 \leq len1-ans+len2-ans+len3-ans+...+lenk-ans 0len1ans+len2ans+len3ans+...+lenkans

所以这里就直接给程序了(三道题的)

SP2885 WORDRING - Word Rings

P3199 [HNOI2009]最小圈

#include<bits/stdc++.h>
using namespace std;
const int MAXN=30000000+51;
const double INF=(1e5)*1.0;
const double eqs=1e-9;
int n,m;
struct node {int net,to;double z;
} e[MAXN];
int head[MAXN],tot;
void add(int x,int y,double z) {e[++tot].net=head[x];e[tot].to=y;e[tot].z=z;head[x]=tot;
}double d[MAXN];
bool v[MAXN],flag;
bool spfa(int x,double k) {v[x]=true;for(register int i=head[x]; i; i=e[i].net) {int y=e[i].to;double z=e[i].z;if(d[y]>d[x]+z-k) {d[y]=d[x]+z-k;if(v[y]==true||spfa(y,k)==true) return true;}}v[x]=false;return false;
}
bool check(double x) {for(register int i=1; i<=n; i++) {d[i]=20040915;v[i]=false;}for(register int i=1; i<=n; i++) {if(spfa(i,x)==true) return true;}return false;
}
int main() {scanf("%d%d",&n,&m);for(register int i=1; i<=m; i++) {int x,y;double z;scanf("%d%d%lf",&x,&y,&z);add(x,y,z);}double l=-INF,r=INF;while(r-l>eqs) {double mid=(l+r)/2;if(check(mid)==true) r=mid;else l=mid;}printf("%.8lf",l);return 0;
}

UVA11090 Going in Cycle!!

#include <bits/stdc++.h>
using namespace std;
int T,n,m,u,v,w,tot;
double dis[520010];
int vis[520010],head[520010];struct node {int to,net;double val;
} e[520010];inline void add(int u,int v,double w) {e[++tot].to=v;e[tot].val=w;e[tot].net=head[u];head[u]=tot;
}inline bool dfs(int now,double x) {vis[now]=1;for(register int i=head[now];i;i=e[i].net) {int v=e[i].to;if(dis[v]>dis[now]+e[i].val-x) {dis[v]=dis[now]+e[i].val-x;if(vis[v]==1||dfs(v,x)==true) return true;}}vis[now]=0;return false;
}inline bool check(double x) {for(register int i=1;i<=n;i++) {vis[i]=0;dis[i]=20050206;}for(register int i=1;i<=n;i++) {if(dfs(i,x)==true) return true;}return false;
}int main() {scanf("%d",&T);for(register int k=1;k<=T;k++) {tot=0;for(register int i=1;i<=n;i++) head[i]=0;scanf("%d%d",&n,&m);for(register int i=1;i<=m;i++) {scanf("%d%d%d",&u,&v,&w);add(u,v,w);}double l=-10000000,r=10000000;while(r-l>1e-10) {double mid=(l+r)/2;if(check(mid)==true) r=mid;else l=mid;}printf("Case #%d: ",k);if(l==10000000) puts("No cycle found.");else printf("%.2lf\n",l);}return 0;
}

http://www.ppmy.cn/news/1569645.html

相关文章

记录一次-Rancher通过UI-Create Custom- RKE2的BUG

一、下游集群 当你的下游集群使用Mysql外部数据库时&#xff0c;会报错&#xff1a; **他会检查ETCD。 但因为用的是Mysql外部数据库&#xff0c;这个就太奇怪了&#xff0c;而且这个检测不过&#xff0c;集群是咩办法被管理的。 二、如果不选择etcd,就选择控制面。 在rke2-…

Qt网络相关

“ 所有生而孤独的人&#xff0c;葆有的天真 ” 为了⽀持跨平台, QT对⽹络编程的 API 也进⾏了重新封装。本章会上手一套基于QT的网络通信编写。 UDP Socket 在使用Qt进行网络编程前&#xff0c;需要在Qt项目中的.pro文件里添加对应的网络模块( network ). QT core gui net…

民法学学习笔记(个人向) Part.2

民法学学习笔记(个人向) Part.2 民法始终在解决两个生活中的核心问题&#xff1a; 私法自治&#xff1b;交易安全&#xff1b; 3. 自然人 3.4 个体工商户、农村承包经营户 都是特殊的个体经济单位&#xff1b; 3.4.1 个体工商户 是指在法律的允许范围内&#xff0c;依法经…

自定义数据集 ,使用朴素贝叶斯对其进行分类

代码&#xff1a; # 导入必要的库 import numpy as np import matplotlib.pyplot as plt# 定义类1的数据点&#xff0c;每个数据点是二维的坐标 class1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4, 1.1]])# 定义类2的数据点&…

【JDBC】数据库连接的艺术:深入解析数据库连接池、Apache-DBUtils与BasicDAO

文章目录 前言&#x1f30d; 一.连接池❄️1. 传统获取Conntion问题分析❄️2. 数据库连接池❄️3.连接池之C3P0技术&#x1f341;3.1关键特性&#x1f341;3.2配置选项&#x1f341;3.3使用示例 ❄️4. 连接池之Druid技术&#x1f341; 4.1主要特性&#x1f341; 4.2 配置选项…

课题推荐——基于自适应滤波技术的多传感器融合在无人机组合导航中的应用研究

无人机在现代航空、农业和监测等领域的应用日益广泛。为了提高导航精度&#xff0c;通常采用多传感器融合技术&#xff0c;将来自GPS、惯性测量单元&#xff08;IMU&#xff09;、磁力计等不同传感器的数据整合。然而&#xff0c;传感器的量测偏差、环境干扰以及非线性特性使得…

LabVIEW涡轮诊断系统

一、项目背景与行业痛点 涡轮机械是发电厂、航空发动机、石油化工等领域的核心动力设备&#xff0c;其运行状态直接关系到生产安全与经济效益。据统计&#xff0c;涡轮故障导致的非计划停机可造成每小时数十万元的经济损失&#xff0c;且突发故障可能引发严重安全事故。传统人…

Vue3.0教程003:setup语法糖

文章目录 3.1 OptionsAPI与CompositionAPIOptions API的弊端Composition API的优势 3.2 拉开序幕的setup3.3 setup语法糖 3.1 OptionsAPI与CompositionAPI vue2的API设计是Options风格的vue3的API设计是Composition&#xff08;组合&#xff09;风格的 Options API的弊端 Opt…