博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ1486】【HNOI2009】最小圈 分数规划 dfs判负环。
阅读量:6180 次
发布时间:2019-06-21

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

链接:

#include 
int main(){ puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/46348771");}

题解:

分数规划Qwq。

然而它卡判点入n次的那种spfa推断负环。
于是有了一种黑科技:
我们从枚举点 i 開始 dfs 。然后扫到点 j 时。保持 i~j 这一条链上的点被标记,然后强行推断再扫一个点 k 时。是否会到这个链上,然后是不是能又一次更新此点 k 与 i 的距离。。。
这个东西是指数级别时间复杂度的。然而却能够过这道题。

代码:

#include 
#include
#include
#include
#include
#define N 3010#define M 10100#define eps 1e-8using namespace std;double mid;struct Eli{ int v,n; double f,l; void re(){l=f-mid;}}e[M];int head[N],cnt;inline void add(int u,int v,double l){ e[++cnt].v=v; e[cnt].f=l; e[cnt].n=head[u]; head[u]=cnt;}int n,m;bool vis[N];double dist[N];bool dfs(int x){ vis[x]=1; int i,v; for(i=head[x];i;i=e[i].n) { v=e[i].v; if(dist[v]>dist[x]+e[i].l) { if(vis[v]) { vis[x]=0; return 1; } else { dist[v]=dist[x]+e[i].l; if(dfs(v)) { vis[x]=0; return 1; } } } } vis[x]=0; return 0;}bool check(){ memset(dist,0,sizeof dist); for(int i=1;i<=m;i++)e[i].re(); for(int i=1;i<=n;i++)if(dfs(i))return 1; return 0;}int main(){ int i,a,b; double c; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d%lf",&a,&b,&c); add(a,b,c); } double l=-1e7,r=1e7; for(i=60;i--;) { mid=(l+r)/2.0; if(check())r=mid; else l=mid; } printf("%.8lf\n",l); return 0;}
你可能感兴趣的文章
陶哲轩实分析习题9.1.6
查看>>
常用音频软件:Cool edit pro
查看>>
努力的方向,除了诗和远方,还有一堆技术。
查看>>
SQL CHECK 约束
查看>>
git提交到一半关闭时
查看>>
WMware 10 Ubuntu 12.04 进入Unity模式
查看>>
简单通用的访问CVS的方法
查看>>
kbengine mmo源码(完整服务端源码+资源+完整客户端源码)
查看>>
【操作系统】实验四 主存空间的分配和回收
查看>>
Log4j 配置 的webAppRootKey参数问题
查看>>
VMware ESXi 5.0中时间配置中NTP设置
查看>>
C++中memset()函数笔记
查看>>
oracle sql 数结构表id降序
查看>>
使用cnpm加速npm
查看>>
MySql跨服务器备份数据库
查看>>
一个字典通过dictionaryWithDictionary 他们的内存指针是不同的
查看>>
HTTP 错误 500.0的解决方法。
查看>>
CCF201612-1 中间数(解法三)(100分)
查看>>
百度前端任务一学习的知识
查看>>
C# 四个字节十六进制数和单精度浮点数之间的相互转化
查看>>