P2850 的代码
#include<bits/stdc++.h>
using namespace std;
const int N=505;
#define inf 2147483647
struct Edge{
int to,value;
};
int T;
int n,m,ww;
int u,v,w;
vector<Edge>G[N];
queue<int>Q;
int dis[N],cnt[N];
bool vis[N];
bool spfa(){
while(!Q.empty()){
Q.pop();
}
for(int i=1;i<=n;i++){
cnt[i]=vis[i]=0;
dis[i]=inf;
}
cnt[0]=1;
vis[0]=1; dis[0]=0;
Q.push(0);
while(!Q.empty()){
int u=Q.front(); Q.pop();
vis[u]=0;
for(int i=0;i<G[u].size();i++){
int v=G[u][i].to,w=G[u][i].value;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(vis[v]==0){
vis[v]=1;
Q.push(v);
if(++cnt[v]>n){
return 1;
}
}
}
}
}
return 0;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin>>T;
while(T--){
cin>>n>>m>>ww;
memset(G,0,sizeof G);
while(m--){
cin>>u>>v>>w;
G[u].push_back({v,w});
}
while(ww--){
cin>>u>>v>>w;
G[u].push_back({v,-w});
}
for(int i=1;i<=n;i++){
G[0].push_back({i,0});
G[i].push_back({0,0});
}
if(spfa()){
cout<<"YES\n";
}
else{
cout<<"NO\n";
}
}
return 0;
}
具体地,我令超级源点为 0,但会出现 0∼2∼0 的负环,这样怎么处理?