【BZOJ】1486 [HNOI2009]最小圈
【算法】二分+spfa
【题解】据说这个叫分数规划?
二分答案a,则对于任意的环有w/k≤a即w-ak≤0,若满足条件则a变小,否则a变大。
因为w=w1+w2+...+wk,所以变形为(w1-a)+(w2-a)+...+(wk-a)≤0。于是问题转化为在图中找负环。
不过由于spfa限制,“=”没办法并入"<",但是由于精度足够,最后也就是1.00000000001≈1.00000000。
使用DFS的spfa:可以在发现更新到之前更新过的节点就认为是负环(从x跑出去最后又回来更新x,说明跑的这段路是负数)。
spfa的d数组(最短路)全部初始化为0(即只更新路径为负的),相当于设置一个起点向所有点连容量为0的边,因为是全图找负环。
确认某个曾访问的节点是祖先,这是DFS的特性和优势。
精度问题:107要求精确到10-8即log(1015)/log(2)=49,所以跑60次二分就能保证精度没问题了。
因为一个memset的size是double(以为是int)调了2小时……QAQ
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- const int maxn=,maxm=;
- const double eps=1e-;
- struct edge{int from,v;double w;}e[maxm];
- int n,m,first[maxn],tot=;
- double d[maxn],w[maxm];
- bool vis[maxn],flag;
- void insert(int u,int v,double w)
- {tot++;e[tot].v=v;e[tot].w=w;e[tot].from=first[u];first[u]=tot;}
- void spfa(int x)
- {
- vis[x]=;
- for(int i=first[x];i;i=e[i].from)
- if(!flag&&d[e[i].v]>d[x]+e[i].w)
- {
- if(vis[e[i].v])
- {
- flag=;
- break;
- }
- d[e[i].v]=d[x]+e[i].w;
- spfa(e[i].v);
- }
- vis[x]=;
- }
- int main()
- {
- scanf("%d%d",&n,&m);
- for(int i=;i<=m;i++)
- {
- int u,v;
- scanf("%d%d%lf",&u,&v,&w[i]);
- insert(u,v,w[i]);
- }
- double l=-,r=;
- while(r-l>eps)
- {
- double mid=(l+r)/;
- flag=;
- memset(d,,*(n+));
- memset(vis,,(n+));
- for(int i=;i<=tot;i++)e[i].w=w[i]-mid;
- for(int i=;i<=n;i++)if(!flag)spfa(i);
- if(flag)r=mid;else l=mid;
- }
- printf("%.8lf",l);
- return ;
- }
【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 ...
- bzoj 1486: [HNOI2009]最小圈
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 HIN ...
- 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千题计划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数组不清零之类的 假设一个答案成立,那么一定可以找到一个环 ...
随机推荐
- 福大软工1816:Alpha(5/10)
Alpha 冲刺 (5/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.忙于复习,本次无成果 展示 ...
- vim map nmap(转)
转自:http://blog.csdn.net/taoshengyang/article/details/6319106 有五种映射存在 - 用于普通模式: 输入命令时. - 用于可视模式: 可视 ...
- docker中crontab无法运行
yum install -y crontabssed -ri 's/.*pam_loginuid.so/#&/' /etc/pam.d/crond vi /etc/pam.d/crond ...
- 文件“bin\Debug\WindowsFormsApplication2.exe”正由另一进程使用,因此该进程无法访问该文件。
http://zhidao.baidu.com/question/221394579.html?qbl=relate_question_2&word=%BE%AF%B8%E6%094%09%C ...
- java 基础--继承--007
1,子类只能继承父类所有非私有成员 2,子类不能继承父类的构造方法,但可以通过super去访问父类构造方法 3,子类成员变量和父类成员变量名称不一样,如果一样类似于重写,按子类处理,如果一样,就近原则 ...
- HashMap源码剖析及实现原理分析(学习笔记)
一.需求 最近开发中,总是需要使用HashMap,而为了更好的开发以及理解HashMap:因此特定重新去看HashMap的源码并写下学习笔记,以便以后查阅. 二.HashMap的学习理解 1.我们首先 ...
- MyBatis配置和日志
MyBatis最关键的组成部分是SqlSessionFactory,我们可以从中获取SqlSession,并执行映射的SQL语句.SqlSessionFactory对象可以通过基于XML的配置信息或者 ...
- 【Python】python基础语法 编码
编码 默认情况下,python以UTF-8编码,所有的字符串都是Unicode字符串,可以为代码定义不同的的编码. #coding:UTF-8 #OR #-*- coding:UTF-8 -*- p ...
- Andorid API Package --->android.animation
包名: android.animation Added in API level 11 URL:http://developer.andr ...
- usaco中遇到的问题
numbers are integers with unique digits 意思是数字中的每一个数字都是不一样的& 让一个图成为强连通图只需添加max(出度为0,入度为0)的点,然后如果图 ...