传递vector<pair<long,long>> adj[]至short函数报错,求原因
解决函数参数传递报错及代码中的其他问题
我来帮你排查一下代码里的问题,你遇到的报错核心原因是踩了C++的关键字坑,还有一些细节问题也需要修正:
核心报错原因:用了C++关键字当函数名
short是C++的关键字(用来声明短整型变量),绝对不能用作函数名,这就是编译器抛出invalid declarator before ‘adj’和expected ‘)’ before ‘adj’的根本原因。把函数名改成比如shortest_path就能解决这个语法错误。
其他需要修正的代码问题
除了函数名的问题,你的代码还有几个编译错误和不规范的地方:
mp不是标准库函数:你写的mp(0,1)要替换成标准的make_pair(0, 1),或者直接用花括号初始化{0, 1}。- pair成员访问错误:C++的
pair类没有.F和.S成员,正确的访问方式是.first和.second,比如pq.top().second、(*it).first。 - 未定义的自定义宏/函数:
loop(i,m)是你自定义的循环宏吧?如果没提前定义,要改成标准的for (int i = 0; i < m; ++i)。print(parent, 1)这个函数你没实现,要么补充打印逻辑,要么暂时注释掉。
- 变长数组不符合C++标准:
vector<pair<long,long>> adj[n+1]是C风格的变长数组,C标准并不支持(部分编译器是扩展支持,但不推荐),建议改成vector<vector<pair<long, long>>> adj(n+1),更符合C规范。 - 类型不匹配风险:
INT_MAX是int类型的最大值,用来初始化long类型的dist数组可能会有溢出问题,应该用LONG_MAX(来自<climits>头文件)。 pb不是标准方法:adj[u].pb(mp(v,w))里的pb是push_back的缩写宏吧?如果没定义,替换成标准的push_back。
修正后的完整代码示例
#include <bits/stdc++.h> using namespace std; void shortest_path(vector<vector<pair<long, long>>> &adj, int n) { vector<long> dist(n+1, LONG_MAX); vector<long> parent(n+1, -1); dist[1] = 0; parent[1] = 1; priority_queue<pair<long, long>, vector<pair<long, long>>, greater<pair<long, long>>> pq; pq.push(make_pair(0, 1)); vector<bool> flag(n+1, false); while (!pq.empty()) { long u = pq.top().second; pq.pop(); if (flag[u]) continue; // 避免重复处理已确定的节点,优化效率 flag[u] = true; for (auto &edge : adj[u]) { long v = edge.first; long wt = edge.second; // 加个dist[u] != LONG_MAX的判断,防止溢出 if (!flag[v] && dist[u] != LONG_MAX && dist[u] + wt < dist[v]) { dist[v] = dist[u] + wt; pq.push(make_pair(dist[v], v)); parent[v] = u; } } } // 补充路径打印的实现,你可以按需调整 cout << "Path to node " << n << ": "; vector<long> path; for (long v = n; v != 1; v = parent[v]) { path.push_back(v); } path.push_back(1); reverse(path.begin(), path.end()); for (long node : path) { cout << node << " "; } cout << endl; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); long n, m; cin >> n >> m; vector<vector<pair<long, long>>> adj(n+1); long u, v, w; for (int i = 0; i < m; ++i) { cin >> u >> v >> w; adj[u].push_back(make_pair(v, w)); adj[v].push_back(make_pair(u, w)); } shortest_path(adj, n); return 0; }
额外说明
- 我在修正后的代码里补充了路径打印的逻辑,你可以根据需求调整。
- 传递
adj的时候用了引用&,避免拷贝大容器带来的性能损耗。
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

