题意:名字很高端的题,虫洞,给定两点直接进行跳跃,问能否回到从某点出发之前的时间,也就是说构成一个回路,形成负环即可,所以说能否构成负环就成为这题的解法,也就是判断负环;
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<cstring>
#include<cstdio>
#define INF 0x3f3f3f3f
using namespace std;
int vulue[505][505];
int dis[505];bool vis[505];int ci[505];
int main(){
int f;
scanf("%d",&f);
for(int i=1;i<=f;i++){
int n,m,w;
memset(vulue,INF,sizeof(vulue));
scanf("%d %d %d",&n,&m,&w);
int a,b,c;
for(int i=1;i<=m;i++){
scanf("%d %d %d",&a,&b,&c);
if(vulue[a][b]!=INF){
vulue[a][b]=min(vulue[a][b],c);
vulue[b][a]=min(vulue[b][a],c);
}
else{
vulue[a][b]=c;
vulue[b][a]=c;
}
}
for(int i=1;i<=w;i++){
scanf("%d %d %d",&a,&b,&c);
vulue[a][b]=(-c);
}
memset(vis,0,sizeof(vis));
memset(dis,INF,sizeof(dis));
memset(ci,0,sizeof(ci));
queue<int>que;
que.push(1);
dis[1]=0;
ci[1]++;
vis[1]=1;
int flag=0;
while(!que.empty()){
int u=que.front();
que.pop();
vis[u]=0;
// cout<<u<<endl;
for(int j=1;j<=n;j++){
if(dis[j]>dis[u]+vulue[u][j]){
dis[j]=dis[u]+vulue[u][j];
if(vis[j]==0){
vis[j]=1;
ci[j]++;
que.push(j);
if(ci[j]>n){
flag=1;
break;
}
}
}
}
if(flag==1){
break;
}
}
if(flag==1) printf("YES\n");
else printf("NO\n");
}
return 0;
}