SPFA负环,邻接表存边,为什么开O2会使所有输出可行解的测试点MLE?
查看原帖
SPFA负环,邻接表存边,为什么开O2会使所有输出可行解的测试点MLE?
542355
LynnvonLemon楼主2024/10/22 19:10

对于同样的代码,不开O2可以AC,开过后只有#2,#4,#6测试点AC。 提交记录:

(如果提交记录马蜂太挤可以看下面dev帮忙格式化的代码())

#include<bits/stdc++.h>
#define N 5005
using namespace std;
int n,m,dis[N],vistime[N];
bool in[N];
vector< pair<int,int> > G[N];
queue<int> q;
int read() {
	int n=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
		n=n*10+c-'0',c=getchar();
	return n*f;
}
int put(int x) {
	if(x<0) putchar('-'),x=-x;
	if(x>9) put(x/10);
	putchar(x%10+'0');
}
bool SPFA() {
	for(int i=1; i<=n; i++)
		dis[i]=1e9;
	q.push(0);
	in[0]=1;
	vistime[0]=1;
	while(!q.empty()) {
		int u=q.front();
		q.pop();
		in[u]=0;
		for(auto to:G[u]) {
			int v=to.first,w=to.second;
			if(dis[v]>dis[u]+w) {
				dis[v]=dis[u]+w;
				if(!in[v]) {
					in[v]=1;
					q.push(v);
					vistime[v]++;
					if(vistime[v]>n)
						return 0;
				}
			}
		}
	}
	return 1;
}
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1,c,c1,y; i<=m; i++) {
		c=read(),c1=read(),y=read();
		G[c1].push_back({c,y});
	}
	for(int i=1; i<=n; i++)
		G[0].push_back({i,0});
	if(SPFA()) {
		for(int i=1; i<=n; i++)
			put(dis[i]),putchar(' ');
	} else
		puts("NO");
	return 0;
}
2024/10/22 19:10
加载中...