C++实现Dijkstra算法报expected unqualified-id before '['错误如何解决
编译错误修复
你遇到的编译错误核心原因是代码中使用了C17版本才引入的结构化绑定语法(auto [d, u]、auto &[v, w]这类写法),编译器默认使用低版本C标准编译时无法识别该语法,有两种修复方式:
- 方式一:开启C++17编译支持
编译时添加参数-std=c++17即可,例如GCC编译命令为g++ sol.cpp -o sol -std=c++17 - 方式二:替换结构化绑定为兼容旧标准的写法
将auto [d, u] = *pq.begin();替换为:
将ii front = *pq.begin(); int d = front.first; int u = front.second;for(auto &[v, w]:AL[u])替换为:for(auto &edge : AL[u]) { int v = edge.first; int w = edge.second;
代码逻辑错误修复
就算编译通过,你当前代码也无法正确运行,还存在以下逻辑问题需要修改:
- 读边循环次数错误:你当前循环
for(int i=0;i<n;i++)读边,应该改为循环m次,因为m是边的数量 - 加边逻辑错误:
AL[u].emplace_back(u, w)应改为AL[u].emplace_back(v, w),AL[v].emplace_back(v, w)应改为AL[v].emplace_back(u, w),否则邻接表存储的节点编号完全错误 - 优先队列初始化错误:初始化循环里
pq.insert({dist[u], u})中的u是未初始化的变量,应该改为pq.insert({dist[i], i})
修复后完整代码
#include<bits/stdc++.h> using namespace std; #define vi vector<int> #define vii vector<pair<int, int>> #define ii pair<int, int> #define INF 1e6 int main() { int n,m,s,t; cin>>n>>m>>s>>t; vector<vii> AL(n, vii()); int u,v,w; for(int i=0;i<m;i++) { cin>>u>>v>>w; AL[u].emplace_back(v, w); AL[v].emplace_back(u, w); } vi dist(n, INF); dist[s] = 0; set<ii> pq; for(int i=0;i<n;i++) { pq.insert({dist[i], i}); } while(!pq.empty()) { ii front = *pq.begin(); int d = front.first; int u = front.second; pq.erase(pq.begin()); for(auto &edge:AL[u]) { int v = edge.first; int w = edge.second; if(dist[u] + w >= dist[v]) continue; pq.erase(pq.find({dist[v], v})); dist[v] = dist[u] + w; pq.insert({dist[v], v}); } } if(dist[t]!=INF) cout<<dist[t]; else cout<<"Unreachable"; return 0; }
内容的提问来源于stack exchange,提问作者Sambit Khandai
相关产品推荐
相关产品推荐

