BZOJ_1486_[HNOI2009]最小圈_01分数规划

Description

Input

Output

Sample Input

4 5
1 2 5
2 3 5
3 1 5
2 4 3
4 1 3

Sample Output

3.66666667
 

二分答案,边权减去答案,判负环即可。
然而spfa判负环会T掉,于是我使用了dfs判负环的方法。
dfs判负环代码:
void dfs(int x)
{
vis[x]=1;
int i;
for(i=head[x];i&&!ok;i=nxt[i]){
if(dis[to[i]]>dis[x]+cost[i]){
dis[to[i]]=dis[x]+cost[i];
if(vis[to[i]]){
ok=1;return ;
}
dfs(to[i]);
}
}
vis[x]=0;
}

不断更新最小值,直到更新了一圈回来,则说明有负环存在。

总之是比spfa快到不知哪里去。

dis数组清零即可。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 3050
#define M 10050
#define du double
#define eps 1e-9
int head[N],to[M],nxt[M],val[M],cnt,n,m;
int dep[N],inq[N],Q[N],l,r,ok,vis[N];
du dis[N],cost[M];
inline void add(int u,int v,int w)
{
to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;val[cnt]=w;
}
void dfs(int x)
{
vis[x]=1;
int i;
for(i=head[x];i&&!ok;i=nxt[i]){
if(dis[to[i]]>dis[x]+cost[i]){
dis[to[i]]=dis[x]+cost[i];
if(vis[to[i]]){
ok=1;return ;
}
dfs(to[i]);
}
}
vis[x]=0;
}
bool check(du x)
{
int i;
for(i=1;i<=m;i++) cost[i]=val[i]-x;
for(i=1;i<=n;i++) dis[i]=vis[i]=0;
for(i=1,ok=0;i<=n;i++)
{
dfs(i);
if(ok) return 1;
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
int i,x,y,z;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
du L=-100000,R=100000;
while(R-L>eps)
{
du mid=(L+R)*0.5;
if(check(mid)) R=mid;
else L=mid;
}
printf("%.8lf\n",L);
}

BZOJ_1486_[HNOI2009]最小圈_01分数规划的更多相关文章

  1. 洛谷P3199 [HNOI2009]最小圈(01分数规划)

    题意 题目链接 Sol 暴力01分数规划可过 标算应该是这个 #include<bits/stdc++.h> #define Pair pair<int, double> #d ...

  2. BZOJ 1486: [HNOI2009]最小圈 [01分数规划]

    裸题...平均权值最小的环.... 注意$dfs-spfa$时$dfs(cl)$...不要写成$dfs(u)$ #include <iostream> #include <cstdi ...

  3. P3199 [HNOI2009]最小圈 01分数规划

    裸题,第二个权值是自己点的个数.二分之后用spfa判负环就行了. 题目描述 考虑带权的有向图G=(V,E)G=(V,E)G=(V,E)以及w:E→Rw:E\rightarrow Rw:E→R,每条边e ...

  4. [HNOI2009]最小圈(分数规划+SPFA判负环)

    题解:求环长比环边个数的最小值,即求min{Σw[i]/|S|},其中i∈S.这题一眼二分,然后可以把边的个数进行转化,假设存在Σw[i]/|S|<=k,则Σw[i]-k|S|<=0,即Σ ...

  5. 【洛谷 P3199】 [HNOI2009]最小圈(分数规划,Spfa)

    题目链接 一开始不理解为什么不能直接用\(Tarjan\)跑出换直接求出最小值,然后想到了"简单环",恍然大悟. 二分答案,把所有边都减去\(mid\),判是否存在负环,存在就\( ...

  6. 【BZOJ1486】最小圈(分数规划)

    [BZOJ1486]最小圈(分数规划) 题面 BZOJ 洛谷 求图中边权和除以点数最小的环 题解 分数规划 二分答案之后将边权修改为边权减去二分值 检查有无负环即可 #include<iostr ...

  7. BZOJ 1486 最小圈(01分数规划)

    好像是很normal的01分数规划题.最小比率生成环. u(c)=sigma(E)/k.转化一下就是k*u(c)=sigma(E). sigma(E-u(c))=0. 所以答案对于这个式子是有单调性的 ...

  8. 洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划

    洛谷4951 地震 #include<iostream> #include<cstdio> #include<algorithm> #define go(i,a,b ...

  9. 【BZOJ1486】[HNOI2009]最小圈 分数规划

    [BZOJ1486][HNOI2009]最小圈 Description Input Output Sample Input 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 3 Samp ...

随机推荐

  1. 超精简易用cocoaPods的安装和使用

    cocoaPods 安装和使用 第一步:替换ruby源 $ gem sources -l                                查看当前ruby的源 $ gem sources ...

  2. angular中的jqLite的基本使用方法

    angular.element() 参数要求是HTML string or DOMElement, angular.element 虽然很接近 jQuery,但是直接通过 HTML tag 去获取元素 ...

  3. Python_让人脑阔疼的编码问题(转)+(整理)

    我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各种编码,比如作为中国程序经常要面对的gbk,gb2312,utf8等,那这些编码是怎么转换成内部的unicode呢? 首 ...

  4. Django(三)runserver 命令源码分析

    应用环境 windows7 pycharm2018 profession python3.6 django2.0 我们在pycharm 启动django项目时,常常有这么一个命令操作: python ...

  5. JavaScript 对象分类

    参考自W3School:JavaScript对象主要有三类. 一:JavaScript核心对象是ECMAScript标准定义好的一些对象与函数,在JavaScript语言中可以直接使用.主要常用有如下 ...

  6. Elasticsearch——起步

    1.下载 地址:https://www.elastic.co/downloads/elasticsearch 2.解压 unzip elasticsearch-1.7.0.zip 3.启动 mv el ...

  7. VMS项目总结

    开发完一个项目后,如果能够很好的对这个项目做个总结,对我们以后的项目开发以及个人技术的积累都会有很大的帮助.最近在外派公司做完一个系统,在此进行一下深入的总结,也希望给读者带来一些个启示. 一.系统介 ...

  8. 【.NET Core】ASP.NET Core之IdentityServer4(1):快速入门

    [.NET Core]ASP.NET Core之IdentityServer4 本文中的IdentityServer4基于上节的jenkins 进行docker自动化部署. 使用了MariaDB,EF ...

  9. 线上Django项目python2到3升级日记

    这两天干了一个几斤疯狂的事情,花不到一个工作日的时间把一个线上Django项目语言版本从python2升级到Python31.字典的一个语法变化 Python2.7: if dict1.haskey( ...

  10. Flex编码随笔

    1.CSS定义最好放在application里面. 2.数据源是数组数据时,最好把数组转换为ArrayCollection. 3.List.CheckBox等控件的HttpService Params ...