SPFA最短路求负环
求助大佬,程序过不了
输入的第一行是一个整数 T,表示测试数据的组数。对于每组数据的格式如下:
第一行有两个整数,分别表示图的点数 n 和接下来给出边信息的条数 m。
接下来 m 行,每行三个整数 u,v,w。
若 w≥0,则表示存在一条从 u 至 v边权为 w 的边,还存在一条从 v 至 u 边权为 w 的边。
若 w<0,则只表示存在一条从 u 至 v 边权为 w 的边。
代码:
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int maxn = 100000 + 5;
int n,m,s;
struct Edge
{
int v,w;
};
vector<Edge> g[maxn];
int dis[maxn],cnt[maxn];
bool inq[maxn],tmp;
void SPFA(int s)
{
queue<int> que;
memset(cnt,0,sizeof(cnt));
memset(dis,0x3f,sizeof(dis));
memset(inq,false,sizeof(inq));
dis[s] = 0;
inq[s] = true;
que.push(s);
while(!que.empty())
{
int u = que.front();
que.pop();
inq[u] = false;
for(int i = 0;i < g[u].size();i++)
{
int v = g[u][i].v,w = g[u][i].w;
if(dis[u] + w < dis[v])
{
dis[v] = dis[u] + w;
if(!inq[v]) que.push(v);
if(++cnt[v] > n)
{
tmp = 1;
return;
}
}
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
int i,u,v,w;
cin>>n>>m;
while(m--)
{
cin>>u>>v>>w;
g[u].push_back((Edge){v,w});
if(w >= 0) g[v].push_back((Edge){u,w});
}
for(i = 1;i <= n;i++)
{
if(tmp) break;
SPFA(i);
}
if(tmp) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
tmp = false;
}
return 0;
}