在解决这个 题目 的时候,我写的代码在本地运行时发生了运行错误。
但是这一份代码交到洛谷评测, 在线评测结果 却是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;
语句之前。
我没有发现哪里出现了纰漏,恳请指正!