题目

求一张有向图的最小正环(环上结点数最小)


分析

有环当且仅当 \(f[i][i]\) 为正数,

那么考虑跑 \(n\) 次 floyd 直接转移,时间复杂度为 \(O(n^4)\)

然而没必要这么做,因为这种转移具有结合律,

首先可以考虑最大的不满足上述条件的节点数加 1 即为答案。

那么可以直接处理出不超过 \(2^i\) 步的 \(f\) 数组,然后用倍增法拼凑即可


代码

#include <cstdio>
#include <cctype>
#include <cmath>
using namespace std;
const int N=311;
int n,m,mx,f[17][N][N],dp[N][N],g[N][N],ans;
int iut(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
int max(int a,int b){return a>b?a:b;}
int main(){
n=iut(),m=iut(),mx=log(n)/log(2);
for (int t=0;t<=mx;++t)
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j) f[t][i][j]=0xcfcfcfcf;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j) dp[i][j]=0xcfcfcfcf;
for (int i=1;i<=n;++i) f[0][i][i]=dp[i][i]=0;
for (int i=1;i<=m;++i){
int x=iut(),y=iut(),w0=iut(),w1=iut();
f[0][x][y]=w0,f[0][y][x]=w1;
}
for (int t=1;t<=mx;++t)
for (int k=1;k<=n;++k)
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
f[t][i][j]=max(f[t][i][j],f[t-1][i][k]+f[t-1][k][j]);
for (int t=mx;~t;--t){
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j) g[i][j]=0xcfcfcfcf;
for (int k=1;k<=n;++k)
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
g[i][j]=max(g[i][j],dp[i][k]+f[t][k][j]);
int flag=0;
for (int i=1;i<=n;++i)
if (g[i][i]) {flag=1; break;}
if (flag) continue;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j) dp[i][j]=g[i][j];
ans|=1<<t;
}
if (ans>=n) printf("0");
else printf("%d",ans+1);
return 0;
}

#倍增,floyd#CF147B Smile House的更多相关文章

  1. 【CF461E】Appleman and a Game 倍增floyd

    [CF461E]Appleman and a Game 题意:你有一个字符串t(由A,B,C,D组成),你还需要构造一个长度为n的字符串s.你的对手需要用t的子串来拼出s,具体来说就是每次找一个t的子 ...

  2. 2018.11.09 bzoj4773: 负环(倍增+floyd)

    传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: ...

  3. 2018.11.09 bzoj1706: relays 奶牛接力跑(倍增+floyd)

    传送门 倍增+floyd板子题. 先列出状态fi,j,kf_{i,j,k}fi,j,k​表示经过iii条边从jjj到kkk的最短路. 然后发现可以用fi−1,j,kf_{i-1,j,k}fi−1,j, ...

  4. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)

    题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...

  5. BZOJ4773: 负环(倍增Floyd)

    题意 题目链接 Sol 倍增Floyd,妙妙喵 一个很显然的思路(然而我想不到是用\(f[k][i][j]\)表示从\(i\)号点出发,走\(k\)步到\(j\)的最小值 但是这样复杂度是\(O(n^ ...

  6. bzoj2165: 大楼(倍增floyd)

    题目大意:一个有向图,n(<=100)个点求一条长度>=m(<=10^18)的路径最少经过几条边. 一开始以为是矩乘,蓝鹅当时还没开始写,所以好像给CYC安利错了嘿嘿嘿QWQ 第一眼 ...

  7. 【BZOJ4773】负环 倍增Floyd

    [BZOJ4773]负环 Description 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得 环上的边权和为负数.保证图中不包含重边 ...

  8. 【bzoj2306】[Ctsc2011]幸福路径 倍增Floyd

    题目描述 一张n个点的有向图,每个点有一个权值.一开始从点$v_0$出发沿图中的边任意移动,移动到路径上的第$i$个点 输入 每一行中两个数之间用一个空格隔开. 输入文件第一行包含两个正整数 n,  ...

  9. 【bzoj1706】[usaco2007 Nov]relays 奶牛接力跑 离散化+倍增Floyd

    题目描述 FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T <= 100) ...

  10. 【bzoj2085】[Poi2010]Hamsters Hash+倍增Floyd

    题目描述 Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字,只要他们的名字是字母序列中的一个子串就算,出现多次可以重复计算.现在Tz想好了要出现多少个名字,请你求出最 ...

随机推荐

  1. pinject依赖注入模块

    pinject 是一个基于 Python 的轻量级依赖注入库,可以方便地实现依赖注入的功能. 下面我们将通过一个简单的示例来演示如何使用 pinject 实现依赖注入. 首先,我们需要安装 pinje ...

  2. go词法作用域陷进

    问题 // 创建一些目录,再将目录删除 // 错误写法 var rmdirs []func() for _, dir := range tempDirs() { os.MkdirAll(dir, 07 ...

  3. ChainMap合并字典

    在python中,我们有两个字典需要合并的时候,可以使用字典的update方法 a = {'a': 1, 'b': 2} b = {'x': 3, 'y': 4} a.update(b) print( ...

  4. python模块imghdr-----推测图像类型

    官方文档 https://docs.python.org/zh-cn/3/library/imghdr.html#module-imghdr 用处 模块推测文件或字节流中的图像的类型 imghdr.w ...

  5. 04-Redis系列之-持久化(RDB,AOF)

    持久化的作用 什么是持久化 redis的所有数据保存在内存中,对数据的更新将异步的保存到硬盘上 持久化的实现方式 快照:某时某刻数据的一个完整备份(mysql的Dump,redis的RDB) 写日志: ...

  6. C++异常的基本概念与用法

    //异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try{}内写可能会抛出异常的代码.catch(类型){处理} 写异常类型和异常处理 抛出 ...

  7. 【项目实战】SpringBoot+vue+iview打造一个极简个人博客系统

    基于SpringBoot+vue+iview个人极简博客 项目介绍 个人极简博客 [个人极简博客]是一个适用于初学者学习的博客系统,其中包含文章分类.写文章.标签管理.用户管理等基础功能,代码简洁注释 ...

  8. Java 异常处理(2) : 方法重写的规则之一:

    1 package com.bytezero.throwable; 2 3 import java.io.FileNotFoundException; 4 import java.io.IOExcep ...

  9. nginx判断是否手机访问

    if ( $http_user_agent ~* "(Android|iPhone|Windows Phone|UC|Kindle|MicroMessenger |iPad)" ) ...

  10. 精贴总结 - 万字长文带你入门Istio

    原文 - 万字长文带你入门Istio 一.个人看法 背景:以docker+k8s普及,支持快速部署,通过k8s允许统一管理 解决:1)设计分布式系统,导致开发难度提高:2)统一多语言的服务治理方案 目 ...