BZOJ4773: 负环

倍增floyd裸题,倍增判断走2^i步是否存在负环就好了。

其实和3763是一样的,然而那题数据挂了。

#include<cstdio>
void upd1(int&a,int b){
	if(a>b)a=b;
}
const int N=301;
typedef int arr[N][N];
int n;
void pre(arr a){
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			a[i][j]=1e9;
}
void dup(arr a,arr b){
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			a[i][j]=b[i][j];
}
bool jud(arr a){
	for(int i=1;i<=n;++i)
		if(a[i][i]<0)return 1;
	return 0;
}
arr c,g,f[9];
void mul(arr a,arr b){
	pre(c);
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			for(int k=1;k<=n;++k)
				upd1(c[i][k],a[i][j]+b[j][k]);
}
int m,u,v,w,s,l;
int main(){
	scanf("%d%d",&n,&m);
	pre(f[0]);
	for(int i=1;i<=n;++i)
		f[0][i][i]=0;
	while(m--){
		scanf("%d%d%d",&u,&v,&w);
		f[0][u][v]=w;
	}
	for(s=1;;++s){
		if(1<<s>n)
			return!~puts("0");
		mul(f[s-1],f[s-1]);
		if(jud(c))break;
		dup(f[s],c);
	}
	dup(g,f[--s]),l=1<<s;
	while(s){
		mul(g,f[--s]);
		if(!jud(c))
			dup(g,c),l|=1<<s;
	}
	printf("%d\n",l+1);
}

  

时间: 2024-12-23 02:15:38

BZOJ4773: 负环的相关文章

bzoj4773 负环 倍增+矩阵

题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4773 题解 最小的负环的长度,等价于最小的 \(len\) 使得存在一条从点 \(i\) 到自己存在一条长度 \(\leq len\) 的负权路径. 为了把 \(\leq len\) 转化为 \(=len\),我们可以给每一个点建立有个边权为 \(0\) 的自环. 所以考虑倍增邻接矩阵,维护两点之间的经过 \(2^i\) 条边的最短路. 倍增的时候判断走了那么多步有没有负环就可以了. 最后结

【BZOJ4773】负环 倍增Floyd

[BZOJ4773]负环 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 <

poj 3259 Wormholes(bellman-ford判断负环)

题目链接:http://poj.org/problem?id=3259 题目就是问你能否回到原点而且时间还倒回去了.题目中有些路中有单向的虫洞能让时间回到过去 所以只要将虫洞这条边的权值赋为负然后再判断有没有负环就行了. #include <iostream> #include <cstring> using namespace std; const int inf = 10001; int f , n , m , w ,dis[1001] , counts; struct TnT

(简单) LightOJ 1074 Extended Traffic,SPFA+负环。

Description Dhaka city is getting crowded and noisy day by day. Certain roads always remain blocked in congestion. In order to convince people avoid shortest routes, and hence the crowded roads, to reach destination, the city authority has made a new

POJ 3259 虫洞旅行 spfa判负环

Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31425   Accepted: 11431 Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way p

洛谷P3385 【模板】负环 DFS-SPFA 判负环 图论

洛谷P3385 [模板]负环 图论 今天get了 一个 DFS-SPFA 判负环的方法 一般的 BFS-SPFA 判负环 一般就是 不停地做,如果某点第 n+1次加入队列中,那么说明这个图存在负环然而我并不会证明,期望复杂度是 O(kM) k 大约是在 2 左右 但是其实对于一些极限数据,最坏可以把他卡到 O( NM) 额,这就直接炸飞了是不是,而且据说,一些数据比较强的题目,总会想到卡一卡SPFA的, 然后我们换一种思路 因为题目中一定存在一种 负环对吧,所以说假如你某段路径权值和为自然数的时

HDU 1217 Arbitrage(Bellman-Ford判断负环+Floyd)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 题目大意:问你是否可以通过转换货币从中获利 如下面这组样例: USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 可以通过US->Br->French->US这样转换,把1美元变成1*0.5*10*0.21=1.05美元赚取%5的利润. 解题思路:其实就相当于bellman-

【模板】负环(spfa)

洛谷——P3385 [模板]负环 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 接下来M行,每行三个整数a b w,表示a->b有一条权值为w的边(若w<0则为单向,否则双向) 输出格式: 共T行.对于每组数据,存在负环则输出一行"YE5"(不含引号),否则输出一行"N0"(不含引号). 输入输出样例

ACM: POJ 3259 Wormholes - SPFA负环判定

POJ 3259 Wormholes Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way pa