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

可以将问题转化为求两点间经过 $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. Mysql 字段类型与查询类型不一致导致索引使用失败

    今天优化数据库的慢查询,有一条Sql让我百思不得其jie,就是他了. SELECT * FROM test WHERE user_id=1; 用explain 去分析一下 索引都有了,为什么还要扫描全 ...

  2. Qt - 基于UDP的网络编程

    UDP(用户数据报协议 User Data Protocol) 轻量级.不可靠.面向数据报.无连接  的传输层协议. 适用情况: 网络数据大多为短消息: 拥有大量客户端: 对数据安全无特殊要求: 网络 ...

  3. C语言作业09

    问题 答案 这个作业属于那个课程 C语言程序设计 这个作业要求在哪里 https://i.cnblogs.com/EditPosts.aspx?opt=1 我在这个课程的目标是 在学好C语言编程的基础 ...

  4. 2015沈阳区域赛Meeting(最短路 + 建图)

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

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

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

  6. django 实现 Mock Server

    大佬 flask 实现mock server地址:https://github.com/yinquanwang/MockServer 参考使用django实现了一下,并已部署到EasyTest测试平台 ...

  7. 表格强制换行 table-layout:fixed

    如果想要一个table固定大小,里面的文字强制换行(尤其是在一长串英文文本,并且中间无空格分隔的情况下),以达到使过长的文字不撑破表格的目的,一般是使用样式:table-layout:fixed.

  8. 启动angular项目,端口被占用

    启动项目,npm start,报如下错误: 解决:1.win+R,输入CMD,启动命令行窗口. 2.输入netstat -ano或者netstat -ano|findstr 8080,查看8080端口 ...

  9. FP Style 的快排

    const quickSort = (list) => { if (!list || !list.length) return []; if (list.length === 1) return ...

  10. Delphi 注释