Floyd能否检测负环
查看原帖
Floyd能否检测负环
1393644
Mornsun楼主2024/7/31 11:09
#include<bits/stdc++.h>
using namespace std;
long long dis[3300][3300];
inline int read()
{
	int x=0;bool f=0;char c=getchar();
	for(;!isdigit(c);f=(c=='-'),c=getchar());
	for(;isdigit(c);x=(x<<3)+(x<<1)+c-48,c=getchar());
	return f?-x:x;
}
inline void write(long long x)
{
	if(x==0)putchar('0');
	if(x<0)putchar('-'),x=-x;
	int temp[20],top=0;
	for(;x;temp[top++]=x%10+48,x/=10);
	for(;top;putchar(temp[--top]));
	putchar('\n');
}
int main()
{
	int n=read(),m=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			dis[i][j]=1e18;
	int u,v,w;
	for(int i=1;i<=m;i++)
	{
		u=read(),v=read(),w=read();
		dis[u][v]=min(dis[u][v],(long long)w);
	}
	for(int i=1;i<=n;i++)
		dis[i][i]=0;
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
			{
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
				if(dis[i][j]+dis[j][i]<0)
				{
					write(-1);
					return 0;
				}
			}
	long long result;
	for(int i=1;i<=n;i++)
	{
		result=0;
		for(int j=1;j<=n;j++)
			result+=j*min(dis[i][j],(long long)1e9);
		write(result);
	}
	return 0;
}

用Floyd过了负环的点,难道Floyd是能检测负环的?求反例

2024/7/31 11:09
加载中...