现在看来这道题就非常好理解了.

可以将问题转化为求两点间经过 $k$ 个点的路径最小值,然后枚举剩余的那一个点即可.

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 303
#define inf 1000000000
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
namespace IO
{
char *p1, *p2, buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
int rd() { int x = 0, f = 1;char c = nc();while (c < 48) {if (c == '-')f = -1;c = nc();}while (c > 47) {x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();}return x * f;}
};
int n,m,dis[N][N][10],tmp[2][N][N];
inline void getmin(int &a,int b) { if(b<a)a=b; }
inline int check()
{
int i;
for(i=1;i<=n;++i) if(tmp[1][i][i]<0) return 1;
return 0;
}
int main()
{
int i,j,k,l,ans=inf;
// setIO("input");
n=IO::rd(),m=IO::rd();
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
for(k=0;k<10;++k) dis[i][j][k]=inf;
}
for(i=1;i<=n;++i) for(k=0;k<10;++k) dis[i][i][k]=0;
for(i=1;i<=m;++i)
{
int a=IO::rd(),b=IO::rd(),c=IO::rd();
getmin(dis[a][b][0], c);
}
for(l=1;l<10;++l)
{
for(k=1;k<=n;++k)
for(i=1;i<=n;++i)
{
if(dis[i][k][l-1]==inf) continue;
for(j=1;j<=n;++j)
{
if(dis[i][k][l-1]<inf && dis[k][j][l-1]<inf)
getmin(dis[i][j][l],dis[i][k][l-1]+dis[k][j][l-1]);
}
}
}
for(i=1;i<=n;++i) for(j=1;j<=n;++j) tmp[0][i][j]=inf;
for(i=1;i<=n;++i) tmp[0][i][i]=0;
int now=0;
for(l=9;l>=0;--l)
{
for(i=1;i<=n;++i) for(j=1;j<=n;++j) tmp[1][i][j]=tmp[0][i][j];
for(k=1;k<=n;++k)
for(i=1;i<=n;++i)
{
if(tmp[0][i][k]==inf) continue;
for(j=1;j<=n;++j)
getmin(tmp[1][i][j], tmp[0][i][k]+dis[k][j][l]);
}
if(check()) getmin(ans,now|(1<<l));
else
{
now|=(1<<l);
for(i=1;i<=n;++i) for(j=1;j<=n;++j) tmp[0][i][j]=tmp[1][i][j];
}
}
printf("%d\n",ans==inf?0:ans);
return 0;
}

  

BZOJ 4773: 负环 倍增Floyd的更多相关文章

  1. bzoj 4773: 负环——倍增

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

  2. 【BZOJ4773】负环 倍增Floyd

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

  3. BZOJ4773: 负环(倍增Floyd)

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

  4. bzoj 4773: 负环 floyd

    题目: 对于边带权的有向图,找出一个点数最小的环,使得环上的边权和为负. 2 <= n <= 300. 题解: 我们可以考虑从小到大枚举答案. 然后每次枚举更大的答案的时候就从当前的较小的 ...

  5. BZOJ4773 负环(floyd+倍增)

    倍增floyd求出经过<=2k条边时两点间最短路,一个点到自身的最短路就是包含该点的最小环.然后倍增找答案即可.注意初始时到自身的最短路设为0,这样求出的最短路就是经过<=2k条边的而不是 ...

  6. bzoj4773 负环 倍增+矩阵

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

  7. 4.28 省选模拟赛 负环 倍增 矩阵乘法 dp

    容易想到 这个环一定是简单环. 考虑如果是复杂环 那么显然对于其中的第一个简单环来说 要么其权值为负 如果为正没必要走一圈 走一部分即可. 对于前者 显然可以找到更小的 对于第二部分是递归定义的. 综 ...

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

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

  9. 负环 BZOJ 4773

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

随机推荐

  1. Java Web - 笔记(1)

    1.web.xml Attribute "xmlns:xsi" must be declared for element type "web-app"相关报错解 ...

  2. win10的64位操作系统安装Oracle、Sql数据库遇到的问题及解决

    因为工作需要,在重新安装操作系统(Win10)不久的电脑上安装Oracle的客户端(win32_11g)和PLSQL,这个本来就比较复杂,下面记录一下遇到的问题及解决方法. 我有储备多个Oracle的 ...

  3. Java四类八项基本数据类型

    一. 四类八项基本数据类型 1. 整数类型(byte.short.int.long) 三点注意事项: a. Java各整数类型有固定的表示范围和字段长度,其不收操作系统的影响,以保持Java的可移植性 ...

  4. linux根目录各个目录介绍

  5. visual studio git 忽略文件配置模板

    ## Ignore Visual Studio temporary files, build results, and## files generated by popular Visual Stud ...

  6. wex5 sqllite本地数据库的运用

    http://doc.wex5.com/?p=3774 需要引入包require("cordova!com.brodysoft.sqlitePlugin"); //本地数据库操作 ...

  7. java 内部类复习

    /** * 内部类详解 * * @author shao * */ public class InnerClass { public static void main(String[] args) { ...

  8. mycat的wrapper.log日志中发现主从切换报错

    可能是MySQL在某些情况下重启(密切关注重启现象,关注日志,找出原因),导致mycat切换主从.由于设置了单向主从,mycat将从库切换为主库,原来的主库宕机.后来重新更新dnindex.conf之 ...

  9. Microsoft Azure Overview

    Day1 Overview 1. Cloud - Internet scaling / Internet connects / Resource pool 2. Why the cloud?  Rap ...

  10. java.util.Arrays (JDK 1.7)

    1.asList //返回由指定数组支持的固定大小的列表,返回的列表是可序列化的 public static <T> List<T> asList(T... a) { retu ...