同样是构造前缀和,跑最短路判负环
#include<iostream>
#include<cstdio>
#include<stack>
#include<queue>
#include<cstring>
#define maxn 1001
using namespace std;
int n,m,T,head[maxn],num,dis[maxn],t[maxn];
bool vis[maxn];
struct edge
{
int to,pre,v;
}e[maxn*2];
void add(int from,int to,int v)
{
e[++num].to=to;
e[num].pre=head[from];
e[num].v=v;
head[from]=num;
}
bool spfa(int s)
{
queue<int>q;
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
q.push(s);vis[s]=1;dis[s]=0;t[s]++;
while(!q.empty())
{
int now=q.front();q.pop();vis[now]=0;
for(int i=head[now];i;i=e[i].pre)
{
int to=e[i].to;
if(dis[to]>dis[now]+e[i].v)
{
dis[to]=dis[now]+e[i].v;
if(!vis[to])
{
q.push(to);vis[to]=1;
t[to]++;
if(t[to]>n)return 1;
}
}
}
}
return 0;
}
int main()
{
scanf("%d",&T);
while(T--)
{
bool flag=0;
scanf("%d%d",&n,&m);
memset(head,0,sizeof(head));
memset(e,0,sizeof(e));
memset(t,0,sizeof(t));
num=0;
int x,y,z;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x-1,y,-z); add(y,x-1,z);
}
for(int i=1;i<=n;i++)
{
if(!t[i])
{
if(spfa(i))
{
printf("false\n");
flag=1;
break;
}
}
}
if(flag==0)printf("true\n");
}
}