BZOJ_4773_负环

Description

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

Input

第1两个整数n, m,表示图的点数和边数。
接下来的m行,每<=三个整数ui, vi, wi,表<=有一条从ui到vi,权值为wi的有向边。
2 <= n <= 300
0 <= m <= n(n <= 1)
1 <= ui, vi <= n
|wi| <= 10^4

Output

仅一行一个整数,表示点数最小的环上的点数,若图中不存在负环输出0。

Sample Input

3 6
1 2 -2
2 1 1
2 3 -10
3 2 10
3 1 -10
1 3 10

Sample Output

2

先开$Logn$个矩阵$dis$,$dis[i][j][k]$表示从$j$到$k$走$2^{i}$条边的最短路。
然后像倍增$lca$那样,再从大到小找到最后一个没有负环的矩阵,再乘一次初始矩阵,判断有没有负环即可。
 
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 350
int f[N][N][20],n,m,L[N];
struct Mat {
int v[301][301];
Mat(){memset(v,0x3f,sizeof(v));}
Mat operator*(const Mat &x)const {
Mat re;int i,j,k;
for(k=1;k<=n;k++) {
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++) {
re.v[i][j]=min(re.v[i][j],v[i][k]+x.v[k][j]);
}
}
}
return re;
}
}dis[10];
bool judge(Mat x) {
int i;
for(i=1;i<=n;i++) {
if(x.v[i][i]<0) return 1;
}
return 0;
}
int main() {
scanf("%d%d",&n,&m);
int i,x,y,z,sum=0;
Mat tmp;
for(i=1;i<=n;i++) dis[0].v[i][i]=tmp.v[i][i]=0;
for(i=2;i<=n;i++) L[i]=L[i>>1]+1;
for(i=1;i<=m;i++) {
scanf("%d%d%d",&x,&y,&z);
dis[0].v[x][y]=z;
}
for(i=1;i<=L[n];i++) dis[i]=dis[i-1]*dis[i-1];
for(i=L[n];i>=0;i--) {
if(!judge(tmp*dis[i])) {
tmp=tmp*dis[i]; sum+=(1<<i);
}
}
tmp=tmp*dis[0];
printf("%d\n",judge(tmp)?sum+1:0);
}

最新文章

  1. winform中固定界面大小的方法
  2. Mysql跨表更新 多表update sql语句总结
  3. javascript中数组的常用方法
  4. Discovering versions from the identity service failed when creating the password plugin.
  5. codeForce-589D Boulevard(判断线段是否相交)
  6. HTML文件基本结构
  7. Servlet&amp;jsp基础:第三部分
  8. php Composer 报ssl证书错误
  9. Ehcache(09)——缓存Web页面
  10. 云计算服务模型,第 1 部分: 基础架构即服务(IaaS)
  11. Centos7安装Docker Engine
  12. 【VB6 学习文档管理系统源码】
  13. js eval()函数 接收一个字符串,做为js代码来执行。 如: s=&#39;var d=&quot;kaka&quot;&#39;; 或者s=‘function (code){return code }’;
  14. JSP元素和标签
  15. 解压Taobao手机客户端发现的东西
  16. 在linux下如何使用yum查看安装了哪些软件包
  17. Linux连接redis客户端出现Could not connect to Redis at 127.0.0.1:6379: Connection refused
  18. 通用base.css —— 《编写高质量代码 web前端开发修炼之道》
  19. dump、load和dumps、loads的区别
  20. 批量增删改&quot;_bulk&quot;

热门文章

  1. node_acl 路径通配
  2. java设计模式--简单工厂
  3. 全面解读Java NIO工作原理(4)
  4. 从输入一个URL到页面完全显示发生了什么?
  5. SOFA 源码分析 — 预热权重
  6. PHP $_FILES函数详解
  7. 语音识别中的CTC算法的基本原理解释
  8. 夜神模拟器链接Android studoid
  9. 一个基于原生JavaScript开发的、轻量的验证码生成插件
  10. HTTP相关:TCP/IP、DNS