【HNOI2009】最小圈 题解(SPFA判负环+二分答案)
2024-10-09 10:24:51
前言:模拟赛考试题,不会做,写了个爆搜滚蛋仍然保龄。
---------------------
题目大意:给定一张有向图,求一个环,使得这个环的长度与这个环的大小(所含结点个数)的比值最小。输出这个比值,保留8位小数。保证数据有解。
---------------------
转化一下题意。要求是使得$C=\frac{\sum\limits_{i=1}^k w[i]}{\sum\limits_{i=1}^k b[i]},b[i]=1$最小。等式变换,得到$\sum\limits_{i=1}^k w[i]-C=0$。我们可以二分这个$C$然后判断有没有负环即可。
貌似看题解是$01$分数规划,我也不太懂。理论上复杂度是$O(nm\log_2 (r-l))$,不过因为算法比较高效也能卡过去。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
const double eps=1e-;
int n,m,vis[maxn];
int head[maxn*],cnt;
struct node
{
int next,to;
double dis;
}edge[maxn*];
double dis[maxn];
inline void add(int from,int to,double dis)
{
edge[++cnt].next=head[from];
edge[cnt].to=to;
edge[cnt].dis=dis;
head[from]=cnt;
}
inline bool spfa(int now,double mid)
{
vis[now]=;
for (int i=head[now];i;i=edge[i].next)
{
int to=edge[i].to;
if (dis[to]>dis[now]+edge[i].dis-mid)
{
dis[to]=dis[now]+edge[i].dis-mid;
if (vis[to]||spfa(to,mid)) return ;
}
}
vis[now]=;
return ;
}
inline bool check(double mid)
{
for (int i=;i<=n;i++) dis[i]=,vis[i]=;
for (int i=;i<=n;i++) if (spfa(i,mid)) return ;
return ;
}
int main()
{
cin>>n>>m;
for (int i=;i<=m;i++)
{
int x,y;double z;cin>>x>>y>>z;
add(x,y,z);
}
double l=-1e7,r=1e7;
while(r-l>eps)
{
double mid=(l+r)/2.0;
if (check(mid)) r=mid;
else l=mid;
}
printf("%.8lf",r);
return ;
}
最新文章
- NSJSONSerialization
- Installing Oracle and ArcSDE on separate servers
- javascript限制上传文件大小
- Java学习资源
- Sqoop安装配置及数据导入导出
- Android 架构
- HashMap的一般用法以及遍历方法
- ALT+数字,可输入汉字或拉丁字母 good
- [React Native] Up and Running
- 封装对Cookie和Session设置或取值的类
- hdu 5124
- js 删除效果代码
- C#解析JSON数据
- S3C6410 纯粹的裸机启动,自己写的SD BOOT启动
- 2017-3-10 SQL server 数据库 T--SQL语句
- Selenium 高阶应用之WebDriverWait 和 expected_conditions
- swift 获取文件大小
- 浅谈使用git进行版本控制
- C# winform引用com组件,创建AXHOST组件失败解决方案
- Linux 如何使用echo指令向文件写入内容
热门文章
- 005.Nginx配置下载站点
- python使用数组实现链表的策略分析
- Django框架02 /Django下载安装、url路由分发
- hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷&#183;一 最详细的解题报告
- bzoj2160拉拉队排练
- OSCP Learning Notes - Buffer Overflows(3)
- 带你上手阿里开源的 Java 诊断利器:Arthas
- PagedList分页,如何添加action参数
- C++语法小记---前置操作符和后置操作符
- 题解 CF785E 【Anton and Permutation】