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

C++中dijkstra函数传入用户自定义二维数组参数报错如何解决

报错原因

你当前代码的核心问题是使用了**变长数组(VLA)**语法:即使用运行时输入的变量V定义数组长度(比如int graph[V][V]、string city[V]),该语法是C语言标准的内容,不属于标准C++规范,仅GCC等少数编译器将其作为扩展支持,这也是你二维数组传参报错的根本原因。

标准C++的动态二维数组传参方案

最推荐的方案是用C标准库的vector容器替代原生数组,完全符合C标准,所有编译器都兼容,不需要依赖编译器扩展。
修改后的完整代码如下:

#include <bits/stdc++.h>
using namespace std;

int minValueIndex(vector<int>& value, vector<bool>& processed, int V)
{
    int minimum = INT_MAX;
    int ver = 0;
    for (int i = 0; i < V; ++i) {
        if (processed[i] == false && value[i] < minimum) {
            ver = i;
            minimum = value[i];
        }
    }
    return ver;
}

// 二维数组参数替换为vector<vector<int>>,城市数组替换为vector<string>
void dijkstra(int V, vector<vector<int>>& graph, int a, int b, vector<string>& city)
{
    vector<int> parent(V); // 替换变长数组为vector
    vector<int> value(V, INT_MAX);
    vector<bool> processed(V, false);
    int src = a, d = b;
    parent[src] = -1;
    value[src] = 0;
    for (int i = 0; i < V - 1; ++i) {
        int index = minValueIndex(value, processed, V);
        processed[index] = true;
        for (int j = 0; j < V; ++j) {
                if (graph[index][j] != 0 && processed[j] == false && value[index] != INT_MAX
                    && (value[index] + graph[index][j] < value[j]))
            {
                value[j] = value[index] + graph[index][j];
                parent[j] = index;
            }
        }
    }
    vector<string> arr(V); // 替换变长数组为vector
    int temp = d;
    int count = 0;
    while (d != src) {
        arr[count] = city[parent[d]];
        d = parent[d];
        count++;
    }
    for (int i = count - 1; i >= 0; i--)
        cout << arr[i] << "->";
    cout << city[temp];
    cout << endl;
    cout << "Happy Journey!!\n";
}

int main()
{
    int V;
    cout << "Enter Total Cities\n";
    cin >> V;
    vector<string> city(V); // 替换变长数组为vector
    cout << "Enter Cities\n";
    for (int i = 0; i < V; i++)
        cin >> city[i];
    cout << "Distance Matrix" << endl;
    vector<vector<int>> graph(V, vector<int>(V)); // 替换变长二维数组为vector
    for (int i = 0; i < V; i++)
        for (int j = 0; j < V; j++)
            cin >> graph[i][j];
    cout << "Enter Source\n";
    string src, des;
    int a = 0, b = 0;
    cin >> src;
    cout << "Enter Destination\n";
    cin >> des;
    for (int i = 0; i < V; i++) {
        if (city[i] == src)
            a = i;
        if (city[i] == des)
            b = i;
    }
    dijkstra(V, graph, a, b, city);
    return 0;
}
其他可选方案

如果不想使用vector,也可以用一维数组手动模拟二维数组的内存布局:

  • 申请长度为V*V的一维数组存储矩阵,按行优先规则访问:graph[i*V + j]对应原二维数组的graph[i][j]
  • 传参时直接传一维数组的首地址int* graph即可,该方法也符合C++标准,但是代码可读性低于vector方案。
注意事项

如果一定要保留原VLA写法,仅在GCC编译环境下可以将函数签名修改为void dijkstra(int V, int (*graph)[V], int a, int b, string city[])即可解决传参报错,但该写法不兼容其他编译器,不推荐在跨平台项目中使用。

内容的提问来源于stack exchange,提问作者Sana Mev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:36:02