STL中调用empty()函数引发的运行错误
  • 板块学术版
  • 楼主WangLianda
  • 当前回复18
  • 已保存回复18
  • 发布时间2022/8/2 12:43
  • 上次更新2023/10/27 17:23:29
查看原帖
STL中调用empty()函数引发的运行错误
643820
WangLianda楼主2022/8/2 12:43

在解决这个 题目 的时候,我写的代码在本地运行时发生了运行错误。

但是这一份代码交到洛谷评测, 在线评测结果 却是AC。

同样的一份代码,交到洛谷评测是AC,但用洛谷的在线IDE运行样例却运行错误。 再开启Dev-C++的调试模式,一行一行走下去,却并没有发生运行错误,程序输出正确答案。

如下:

#include<iostream>
#include<vector>
#include<queue>
#include<climits>
#include<cstring>
using namespace std;
vector<vector<pair<int,int>>> G;
int n,m,s;
bool vis[10010];
int d[10010];
void dijkstra() {
	for(auto&i:vis) i=false;
	for(auto&i:d) i=INT_MAX;
	d[s]=0;
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
	q.push(make_pair(d[s],s));
	while(!q.empty()) {
//		cout<<1<<endl;
		int u=q.top().second;
		q.pop();
		if(vis[u]) continue;
		vis[u]=true;
//		cout<<u<<endl;
		for(auto&i:G[u]) {
			if(d[i.first]>d[u]+i.second) {
				d[i.first]=d[u]+i.second;
				q.push(make_pair(d[i.first],i.first));
			}
		}
	}
}
int main() {
	cin>>n>>m>>s;
	for(int i=1;i<=n;i++) {
		vector<pair<int,int>> x;
		G.push_back(x);
	}
	for(int i=1;i<=m;i++) {
		int u,v,w;
		cin>>u>>v>>w;
		G[u].push_back(make_pair(v,w));
	}
	dijkstra();
	for(int i=1;i<=n;i++) cout<<d[i]<<' ';
}

将紧贴在dijkstra函数中的while后面的第二个注释语句取消注释,理想运行结果应为:

1
2
4
3
0 2 4 3

实际只输出了(如果不开调试模式的话):

1
2
4

经过进一步调试,发现应当输出 3 的循环开始没有按照理想执行。

在进入本次循环的第一时间/上一次循环的后半部分时就已经发生了运行错误。

也就是说,运行错误应当发生于上一次循环输出了 4 之后,下一次运行到

int u=q.top().second;

语句之前。

我没有发现哪里出现了纰漏,恳请指正!

2022/8/2 12:43
加载中...