用SPFA判断一下每个点入队的次数,如果大于点数,就是有负环。
/*
狗贼,看我代码请自动转账一元
*/
//#include<bits/stdc++.h>
/*#include <iostream>
#include <stdlib.h>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <iomanip>
//#pragma GCC optimize(2)
#include<time.h>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxn 2005
#define inf 1e18
#define eps 0.00001
typedef long long ll;
const ll mod = 1e9+7;
const double pi = acos(-1);
ll T,n,m;
void slove()
{
ll num[maxn],dis[maxn];
vector< pair<ll,ll> >vis[maxn];
bool flag[maxn];
cin >> n >> m;
for(ll i = 1; i <= m; i++)
{
ll a,b,c;
cin >> a >> b >> c;
if(c < 0)
vis[a].push_back( make_pair<ll,ll>(b,c) );
else
{
vis[a].push_back( make_pair<ll,ll>(b,c) );
vis[b].push_back( make_pair<ll,ll>(a,c) );
}
}
for(ll i = 1; i <= n; i++)
{
dis[i] = inf;
flag[i] = 0;
num[i] = 0;
}
queue<ll>A;
A.push(1);
flag[1] = 1;
dis[1] = 0;
num[1]++;
while( !A.empty() )
{
ll now = A.front();
A.pop();
flag[now] = 0;
for(ll i = 0; i < vis[now].size(); i++)
{
if( dis[ vis[now][i].first ] > dis[ now ] + vis[now][i].second )
{
dis[ vis[now][i].first ] = dis[ now ] + vis[now][i].second;
if( flag[ vis[now][i].first ] == 0)
{
flag[ vis[now][i].first ] == 1;
A.push( vis[now][i].first );
num[ vis[now][i].first ] ++;
}
if(num[ now ] > n)
{
cout << "YE5" << endl;
return ;
}
}
}
}
cout << "N0" << endl;
return ;
}
int main()
{
//srand((ll)time(0));
ios::sync_with_stdio;
cin.tie(0),cout.tie(0);
cin >> T;
while(T--)
{
slove();
}
return 0;
}*/
//fabs(t1-t2) >= eps