博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1486:[HNOI2009]最小圈——题解
阅读量:5797 次
发布时间:2019-06-18

本文共 1382 字,大约阅读时间需要 4 分钟。

题面太鬼畜就不粘了。

这题唯一正确的解法是虽然我看不懂。

当然为了AC这道题于是抛弃自己的灵魂写了dfs-spfa结果跑的飞快。

这样的题算是出锅了吧……

简单讲下做法,二分答案,对每条边减去这个答案搜负环,如果存在的话该答案合法,否则不合法。

#include
#include
#include
#include
#include
#include
using namespace std;typedef double dl;const dl INF=1e7;const dl eps=1e-9;const int N=3e3+5;const int M=1e4+5;struct node{ int to,nxt; dl w;}e[M];int cnt,head[N],n,m,sum[N];bool vis[N],ok;dl dis[N];queue
q;inline void add(int u,int v,dl w){ e[++cnt].to=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;}void spfa(int u){ vis[u]=1; for(int i=head[u];i&&!ok;i=e[i].nxt){ int v=e[i].to;dl w=e[i].w; if(dis[v]>=dis[u]+w){ dis[v]=dis[u]+w; if(vis[v]||ok){ok=1;return;} spfa(v); } } vis[u]=0;}bool pan(dl delta){ for(int i=1;i<=m;i++)e[i].w-=delta; for(int i=1;i<=n;i++)vis[i]=0,dis[i]=0; ok=0; for(int i=1;i<=n&&!ok;i++) spfa(i); for(int i=1;i<=m;i++)e[i].w+=delta; return ok;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int u,v;dl w; scanf("%d%d%lf",&u,&v,&w); add(u,v,w); } dl l=-INF,r=INF; while(fabs(r-l)>eps){ dl mid=(l+r)/2; if(pan(mid))r=mid; else l=mid; } printf("%.8lf\n",l); return 0;}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客: +

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8976133.html

你可能感兴趣的文章
Linux学习笔记之三
查看>>
2463: [中山市选2009]谁能赢呢?
查看>>
3631: [JLOI2014]松鼠的新家
查看>>
微信公众号
查看>>
Android_内部文件读取
查看>>
QTP的那些事---webtable的一些重要使用集合精解
查看>>
POJ1061 青蛙的约会(扩展欧几里得)题解
查看>>
[JavaWeb]关于DBUtils中QueryRunner的一些解读(转)
查看>>
C/C++之循环结构
查看>>
Django 2.1.3 文档
查看>>
hdu2147
查看>>
Linux使用bitnami安装redmine
查看>>
Maven 项目生成或者update jdk变为1.5的问题
查看>>
【SICP练习】86 练习2.58
查看>>
python学习笔记一
查看>>
格式化输入函数scanf()及输入输出函数的*修饰符
查看>>
Chapter 8. 面向对象(封装)
查看>>
练习:WinForm--DataGridView增删改查完整版
查看>>
js排序之选择排序
查看>>
git add详解
查看>>