错误代码 1(https://www.luogu.com.cn/record/197505014):
#include<bits/stdc++.h>
using namespace std;
const int maxn=6005;
int dis[maxn],vis[maxn];
struct node{
int u,v,w;
}edge[maxn];
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t;cin>>t;
while(t--){
int n,m;cin>>n>>m;
int u,v,w,tot=0;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
if(w>=0){
edge[++tot]=node{u,v,w};
edge[++tot]=node{v,u,w};
}
else edge[++tot]=node{u,v,w};
}
for(int i=1;i<=n;i++) dis[i]=1e9,vis[i]=0;
dis[1]=0;
for(int k=1;k<=n;k++){
for(int i=1;i<=tot;i++){
if(dis[edge[i].u]+edge[i].w<dis[edge[i].v]){
dis[edge[i].v]=dis[edge[i].u]+edge[i].w;
vis[edge[i].v]++;
}
}
}
int tag=0;
for(int i=1;i<=n;i++){
if(vis[i]>=n){tag=1;break;}
}
cout<<(tag?"YES\n":"NO\n");
}
return 0;
}
错误代码 2(https://www.luogu.com.cn/record/197506466):
#include<bits/stdc++.h>
using namespace std;
const int maxn=6005;
long long dis[maxn];
struct node{
int u,v,w;
}edge[maxn];
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t;cin>>t;
while(t--){
int n,m;cin>>n>>m;
int u,v,w,tot=0;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
if(w>=0){
edge[++tot]=node{u,v,w};
edge[++tot]=node{v,u,w};
}
else edge[++tot]=node{u,v,w};
}
for(int i=1;i<=n;i++) dis[i]=1e18;
dis[1]=0;
for(int k=1;k<n;k++){
for(int i=1;i<=tot;i++){
if(dis[edge[i].u]+edge[i].w<dis[edge[i].v]){
dis[edge[i].v]=dis[edge[i].u]+edge[i].w;
}
}
}
int tag=0;
for(int i=1;i<=tot;i++){
if(dis[edge[i].u]+edge[i].w<dis[edge[i].v]){
tag=1; break;
}
}
cout<<(tag?"YES\n":"NO\n");
}
return 0;
}
正确代码(https://www.luogu.com.cn/record/197506604):
#include<bits/stdc++.h>
using namespace std;
const int maxn=6005;
long long dis[maxn];
struct node{
int u,v,w;
}edge[maxn];
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t;cin>>t;
while(t--){
int n,m;cin>>n>>m;
int u,v,w,tot=0;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
if(w>=0){
edge[++tot]=node{u,v,w};
edge[++tot]=node{v,u,w};
}
else edge[++tot]=node{u,v,w};
}
for(int i=1;i<=n;i++) dis[i]=1e18;
dis[1]=0;
for(int k=1;k<n;k++){
for(int i=1;i<=tot;i++){
if(dis[edge[i].u]+edge[i].w<dis[edge[i].v]){
dis[edge[i].v]=dis[edge[i].u]+edge[i].w;
}
}
}
int tag=0;
for(int i=1;i<=tot;i++){
if(dis[edge[i].u]==1e18 or dis[edge[i].v]==1e18) continue;
if(dis[edge[i].u]+edge[i].w<dis[edge[i].v]){
tag=1; break;
}
}
cout<<(tag?"YES\n":"NO\n");
}
return 0;
}