题意:判断负数回环
思路:spfa算法,当某个点进入队列queue的次数大于总顶点数时,说明存在负环。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <utility>
#include <queue>
#define INF 0x7fffffff
using namespace std;
int a[1005],vis[1005],dis[1005],n,m,T,b[1005];
vector<pair<int,int>> e[1005];
int spfa(int s)
{
queue<int> q;
q.push(s);
dis[s]=0;
vis[s]=1;
while(!q.empty())
{
int now=q.front();
q.pop();
vis[now]=0;
b[now]++;
if(b[now]>n)
return 1;
for(int i=0;i<e[now].size();i++)
{
int y=e[now][i].first;
int t=e[now][i].second;
if(dis[y]>dis[now]+t)
{
dis[y]=dis[now]+t;
if(vis[y])
continue;
vis[y]=1;
q.push(y);
}
}
}
return 0;
}
int main()
{
int x,y,t;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
memset(b,0,sizeof(b));
for(int i=0;i<n;i++)
{
e[i].clear();
dis[i]=INF;
}
while(m--)
{
scanf("%d%d%d",&x,&y,&t);
e[x].push_back({y,t});
}
if(spfa(0))
printf("possible\n");
else
printf("not possible\n");
}
return 0;
}