bzoj 1486: [HNOI2009]最小圈
Description

Input
Output
Sample Input
1 2 5
2 3 5
3 1 5
2 4 3
4 1 3
Sample Output
HINT
Source
额...APIO2017极限弱化版...
做法的话直接上分数规划的套路即可,没什么好说的;
二分后,相当判断有没有小于等于0的环,直接spfa判负环即可
但zz选手竟然T了两回,一次因为memset,一次是把进队次数卡的是n!!!(差不多只要100)
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#define RG register
using namespace std;
typedef long long ll;
const int N=1000050;
const double eps=1e-9;
int gi()
{
int x=0,flag=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') flag=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*flag;
}
struct edge{
int x,y,w;
}road[N];
int head[N],nxt[N],to[N],cnt,n,m,vis[N];
double v[N],dis[N];
inline void lnk(RG int x,RG int y,RG double z){
to[++cnt]=y,nxt[cnt]=head[x],v[cnt]=z,head[x]=cnt;
}
inline bool spfa(RG int x) {
for(RG int i=head[x];i;i=nxt[i]) {
RG int y=to[i];
if(dis[y]>dis[x]+v[i]) {
dis[y]=dis[x]+v[i];
if(vis[y]++>100||spfa(y)) return 1;
}
}
return 0;
}
int main(){
n=gi(),m=gi();
for(RG int i=1;i<=m;i++){
road[i].x=gi(),road[i].y=gi(),road[i].w=gi();
}
double l=-10000000,r=10000000,ans;
while(r-l>=eps){
double mid=(l+r)/2;int flag=0;
for(int i=1;i<=n;i++) head[i]=0;cnt=1;
for(RG int i=1;i<=m;i++) lnk(road[i].x,road[i].y,road[i].w-mid);
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) dis[j]=0,vis[j]=0;
if(spfa(i)) {flag=1;break;};
}
if(flag) r=mid,ans=mid;
else l=mid;
}
printf("%.8f\n",ans);
}
bzoj 1486: [HNOI2009]最小圈的更多相关文章
- bzoj 1486: [HNOI2009]最小圈 dfs求负环
1486: [HNOI2009]最小圈 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1022 Solved: 487[Submit][Status] ...
- BZOJ 1486: [HNOI2009]最小圈( 二分答案 + dfs判负圈 )
二分答案m, 然后全部边权减掉m, 假如存在负圈, 那么说明有平均值更小的圈存在. 负圈用dfs判断. ------------------------------------------------ ...
- [BZOJ 1486][HNOI2009]最小圈(二分答案+dfs写的spfa判负环)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1486 分析:容易想到先二分答案x,然后把所有边的权值-x,那么如果图中存在权值和为0的 ...
- BZOJ 1486: [HNOI2009]最小圈 [01分数规划]
裸题...平均权值最小的环.... 注意$dfs-spfa$时$dfs(cl)$...不要写成$dfs(u)$ #include <iostream> #include <cstdi ...
- 1486: [HNOI2009]最小圈
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 3129 Solved: 1543[Submit][Status][Discuss] Descripti ...
- 1486: [HNOI2009]最小圈 - BZOJ
在机房的小伙伴提醒是二分之后,我想到了是判负环,所以我用spfa,而且我保持dis都是小于等于0,本以为这样就能过了,可是还是有一个点达到了3.8s左右(其他都是0.0几秒) 所以还是写了dfs版 ...
- 【BZOJ】1486 [HNOI2009]最小圈
[算法]二分+spfa [题解]据说这个叫分数规划? 0-1分数规划 二分答案a,则对于任意的环有w/k≤a即w-ak≤0,若满足条件则a变小,否则a变大. 因为w=w1+w2+...+wk,所以变形 ...
- bzoj千题计划227:bzoj1486: [HNOI2009]最小圈
http://www.lydsy.com/JudgeOnline/problem.php?id=1486 二分答案 dfs版spfa判负环 #include<queue> #include ...
- BZOJ1486 HNOI2009 最小圈 【01分数规划】
BZOJ1486 HNOI2009 最小圈 Description 应该算是01分数规划的裸板题了吧..但是第一次写还是遇到了一些困难,vis数组不清零之类的 假设一个答案成立,那么一定可以找到一个环 ...
随机推荐
- C#学习笔记随笔(1)----C#中static关键字的作用
静态分配的,有两种情况: 1. 用在类里的属性.方法前面,这样的静态属性与方法不需要创建实例就能访问, 通过类名或对象名都能访问它,静态属性.方法只有“一份”:即如果一个类新建有N个 对象,这N 个对 ...
- 关于Could not resolve dependencies for project
异常:Could not resolve dependencies for project 思路:网上提出的方案思路都是把相互依赖的项目导入到本地仓库中. 目前一劳永逸的方法是:将<packag ...
- 纯Socket(BIO)长链接编程的常见的坑和填坑套路
本文章纯属个人经验总结,伪代码也是写文章的时候顺便白板编码的,可能有逻辑问题,请帮忙指正,谢谢. Internet(全球互联网)是无数台机器基于TCP/IP协议族相互通信产生的.TCP/IP协议族分了 ...
- PHP使用api的两种方法
1.用file_get_contents()函数 $params = array('key' => '8d284859d04cfeeea6b0771f754adb49', 'location' ...
- php条件语句(二)
switch 语句用于根据多个不同条件执行不同动作. PHP Switch 语句 如果您希望有选择地执行若干代码块之一,请使用 switch 语句. 语法 switch (n){case label1 ...
- OC在终端编写和运行
初学者如果想在终端写OC程序的话可以使用一下方法 1.编写.m文件 2.编译.m文件: cc -c 文件名.m 3.再执行: cc 文件名.o -framework Foundation 4. 执行a ...
- CentOS下redis集群安装
环境: 一台CentOS虚拟机上部署六个节点,创建3个master,3个slave节点 1.下载并解压 cd /root wget http://download.redis.io/releases/ ...
- IntelliJ IDEA(一) :安装
前言 我是从eclipse转IDEA的,对于习惯了eclipse快捷键的我来说,转IDEA开始很不习惯,IDEA快捷键多,组合多,记不住,虽然可以设置使用eclipse的快捷键,但是总感觉怪怪的.开始 ...
- java学习笔记—集合之Map集合
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 12.0px Times } p.p2 { margin: 0.0p ...
- MySQL系列:基于binlog的增量订阅与消费(一)
在一些业务场景中,像在数据分析中我们有时候需要捕获数据变化(CDC):在数据审计中,我们也往往需要知道数据从这个点到另一个点的变化:同样在实时分析中,我们有时候需要看到某个值得实时变化等. 要解决以上 ...