容易想到 这个环一定是简单环。

考虑如果是复杂环 那么显然对于其中的第一个简单环来说 要么其权值为负 如果为正没必要走一圈 走一部分即可。

对于前者 显然可以找到更小的 对于第二部分是递归定义的。

综上 这个环是一个简单环。

那么最多有n个点。

考虑枚举起点 然后 设f[i][j][k]表示从i到j经过k条边的最短路。

容易发现最终的答案为 f[i][i][w]<0 w.

不过这样做是n^4的。

考虑优化 容易想到二分 而上述状态其实本质上是一个矩阵乘法。

那么我们可以矩阵乘法在n^3logn的时间内得到二分出答案的矩阵。

但是这样正确性有点问题。考虑二分的答案并没有一定的单调性。

一个负环大小可能为3 长度为4时可能没有负环。

更改状态比较好 设f[i][j][k]表示从i到j <=k条边的最短路

这样负环就可以被我们保留下来了 关于这个转移 一个比较大胆的想法是 每次矩阵乘法之后对原矩阵取min.

看起来毫无道理 但是 容易发现这个取min操作相当于 做矩阵乘法时 对角线的值全部为0.

至此我们得到了一个普通意义 即 自己到自己有一个0条边的东西。

如果我们要求的答案为mid 那么显然 mid可以由两个小于mid的最短路组成。

从最优性来看这显然存在。所以这样做是正确的。

不过还需要优化复杂度。

考虑倍增出答案。预处理出矩阵即可。

复杂度n^3log.

  1. const int MAXN=310,G=3;
  2. int n,m,maxx,ans;
  3. int b[MAXN][MAXN],c[MAXN][MAXN];
  4. int a[12][MAXN][MAXN];
  5. int main()
  6. {
  7. freopen("cycle.in","r",stdin);
  8. freopen("cycle.out","w",stdout);
  9. memset(a,0x3f,sizeof(a));
  10. memset(b,0x3f,sizeof(b));
  11. get(n);get(m);
  12. rep(1,n,i)rep(1,n,j)a[0][i][j]=INF;
  13. rep(1,m,i)
  14. {
  15. int get(x),get(y),get(z);
  16. a[0][x][y]=min(a[0][x][y],z);
  17. }
  18. rep(1,n,i)a[0][i][i]=0,b[i][i]=0;
  19. maxx=9;
  20. rep(1,maxx,w)
  21. {
  22. rep(1,n,i)rep(1,n,j)
  23. {
  24. int ww=INF;
  25. rep(1,n,k)ww=min(ww,a[w-1][i][k]+a[w-1][k][j]);
  26. a[w][i][j]=ww;
  27. }
  28. }
  29. int flag=0;
  30. rep(1,n,i)if(a[maxx][i][i]<0)flag=1;
  31. if(!flag){puts("0");return 0;}
  32. fep(maxx,0,w)
  33. {
  34. rep(1,n,i)rep(1,n,j)
  35. {
  36. int ww=INF;
  37. rep(1,n,k)ww=min(ww,b[i][k]+a[w][k][j])%mod;
  38. c[i][j]=ww;
  39. }
  40. flag=0;
  41. rep(1,n,i)if(c[i][i]<0){flag=1;break;}
  42. if(flag)continue;
  43. rep(1,n,i)rep(1,n,j)b[i][j]=c[i][j];
  44. ans=ans|(1<<w);
  45. }
  46. put(ans+1);
  47. return 0;
  48. }

4.28 省选模拟赛 负环 倍增 矩阵乘法 dp的更多相关文章

  1. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

  2. bzoj4773 负环 倍增+矩阵

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4773 题解 最小的负环的长度,等价于最小的 \(len\) 使得存在一条从点 \(i\) 到自 ...

  3. 4.28 省选模拟赛模拟赛 最佳农场 二维卷积 NTT

    第一次遇到二维卷积 不太清楚是怎么做的. 40分暴力比对即可. 对于行为或者列为1时 容易想到NTT做快速匹配.然后找答案即可. 考虑这是一个二维的比对过程. 设\(f_{i,j}\)表示以i,j为右 ...

  4. 省选模拟赛 Problem 3. count (矩阵快速幂优化DP)

    Discription DarrellDarrellDarrell 在思考一道计算题. 给你一个尺寸为 1×N1 × N1×N 的长条,你可以在上面切很多刀,要求竖直地切并且且完后每块的长度都是整数. ...

  5. 5.19 省选模拟赛 小B的夏令营 概率 dp 前缀和优化dp

    LINK:小B的夏令营 这道题是以前从没见过的优化dp的方法 不过也在情理之中. 注意读题 千万不要像我这个sb一样 考完连题意都不知道是啥. 一个长方形 要求从上到下联通的概率. 容易发现 K天只是 ...

  6. 4.11 省选模拟赛 序列 二分 线段树优化dp set优化dp 缩点

    容易想到二分. 看到第一个条件容易想到缩点. 第二个条件自然是分段 然后让总和最小 容易想到dp. 缩点为先:我是采用了取了一个前缀最小值数组 二分+并查集缩点 当然也是可以直接采用 其他的奇奇怪怪的 ...

  7. Qbxt 模拟赛 Day4 T2 gcd(矩阵乘法快速幂)

    /* 矩阵乘法+快速幂. 一开始迷之题意.. 这个gcd有个规律. a b b c=a*x+b(x为常数). 然后要使b+c最小的话. 那x就等于1咯. 那么问题转化为求 a b b a+b 就是斐波 ...

  8. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  9. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

随机推荐

  1. 使用原生js来控制、修改CSS伪元素的方法总汇, 例如:before和:after

    在网页中,如果需要使用辅助性/装饰性的内容的时候,我们不应该直接写在HTML中,这样会影响真正的内容,这就需要使用伪元素了,这是由于css的纯粹语义化是没有意义的.在使用伪元素的时候,会发现js并不真 ...

  2. 【板子】数论基础(持续更新ing...)

    #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #inclu ...

  3. C# 基于内容电影推荐项目(一)

    从今天起,我将制作一个电影推荐项目,在此写下博客,记录每天的成果. 其实,从我发布 C# 爬取猫眼电影数据 这篇博客后, 我就已经开始制作电影推荐项目了,今天写下这篇博客,也是因为项目进度已经完成50 ...

  4. 【转】Hbuilder配置Avalon、Vue指令提示

    转载自CSDN http://blog.csdn.net/jianggujin/article/details/71419828 我本人是一名Java后端开发,偶尔也会研究一下前端内容,因为Hbuil ...

  5. 终于理解Python中的迭代器和生成器了!

    迭代器和生成器 目录 迭代器和生成器 可迭代对象和迭代器 基础概念 判断 for循环本质 不想用for循环迭代了,如何使用迭代器? 列表推导式 生成器Generator 概念 如何实现和使用? 生成器 ...

  6. Python 默认参数 关键词参数 位置参数

    def StudentInfo(country='中国', name): print('%s,%s' % (name, country)) StudentInfo('美国', '大卫') 上述代码报错 ...

  7. drf源码剖析系列(系列目录)

    drf源码剖析系列(系列目录) 01 drf源码剖析之restful规范 02 drf源码剖析之快速了解drf 03 drf源码剖析之视图 04 drf源码剖析之版本 05 drf源码剖析之认证 06 ...

  8. 面试软件测试工程师——盘点HR的那些黑话

    当疫情过后,应该有很多测试实习生寻找测试岗或者已从业测试岗的群体进行跳槽:最近也收到很多测试新生的咨询,在这里简单分享一下!老铁们走起!今天在这里就简单做跟大家聊一聊面试过程中你与面试官/HR聊天过程 ...

  9. 代码Verify简介

    序 对于开发者而言,编译代码和提交代码是必不可少的流程,同一个需求反复提交的情况也时常出现,那么怎么避免这种情况,且保证代码的质量,这就是Verify CI的目标.Verify表示认证验证的意思,结合 ...

  10. 题解 CF576D 【Flights for Regular Customers】

    对每条边来说,可以走这条边的限制解除是按\(d\)的顺序,所以先对每条边按\(d\)排序. 然后考虑每两条边之间的处理,用一个矩阵表示当前走\(d\)步是否可以从一个点到另一个点,称其为状态矩阵,用另 ...