You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:22:43