【悬 3 关】为什么这样是对的而那样是错的
查看原帖
【悬 3 关】为什么这样是对的而那样是错的
571147
zhlzt楼主2025/1/9 15:53

错误代码 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;
}
2025/1/9 15:53
加载中...