C 当我试图使用超过100条边的输入文件时,为什么我的代码会崩溃? #包括 #定义图形化2048 #定义无限图形化*图形化 #定义最大值(a,b)((a>b)?(a):(b)) int e;/*图中非零边的数目*/ int n;/*图中的节点数*/ 长距离[图

C 当我试图使用超过100条边的输入文件时,为什么我的代码会崩溃? #包括 #定义图形化2048 #定义无限图形化*图形化 #定义最大值(a,b)((a>b)?(a):(b)) int e;/*图中非零边的数目*/ int n;/*图中的节点数*/ 长距离[图,c,crash,dijkstra,infinity,C,Crash,Dijkstra,Infinity,当我试图使用超过100条边的输入文件时,为什么我的代码会崩溃? #包括 #定义图形化2048 #定义无限图形化*图形化 #定义最大值(a,b)((a>b)?(a):(b)) int e;/*图中非零边的数目*/ int n;/*图中的节点数*/ 长距离[图形化][图形化]; 长d[图形化]; int prev[图形化]; 无效打印路径(int dest){ 如果(上一步[目标]!=-1) 打印路径(上一个[目的地]); printf(“%d”,dest); } 迪杰克斯特拉(内景s){ inti

当我试图使用超过100条边的输入文件时,为什么我的代码会崩溃?
#包括
#定义图形化2048
#定义无限图形化*图形化
#定义最大值(a,b)((a>b)?(a):(b))
int e;/*图中非零边的数目*/
int n;/*图中的节点数*/
长距离[图形化][图形化];
长d[图形化];
int prev[图形化];
无效打印路径(int dest){
如果(上一步[目标]!=-1)
打印路径(上一个[目的地]);
printf(“%d”,dest);
}
迪杰克斯特拉(内景s){
inti,k,mini;
int访问[图形化];

对于(i=1;i
图形化
可能小于
n
,这将在
d[i]处爆炸=无穷大
怎么办?在调试器中运行程序,调试器将在崩溃位置停止,让您检查并遍历函数调用堆栈,还让您检查调用堆栈的每个级别的变量值。这将有助于您找到代码中崩溃发生的位置。如果您无法找到,则n至少请编辑您的问题,以显示崩溃发生的位置以及所有相关变量的值。我将graphsize更改为100,因为我的节点是100,现在它似乎没有崩溃。但结果很奇怪,因为它似乎没有通过递归调用从node1-Node100堆栈溢出找到任何快捷方式?
#include <stdio.h>

#define GRAPHSIZE 2048
#define INFINITY GRAPHSIZE*GRAPHSIZE
#define MAX(a, b) ((a > b) ? (a) : (b))

int e; /* The number of nonzero edges in the graph */
int n; /* The number of nodes in the graph */
long dist[GRAPHSIZE][GRAPHSIZE]; 
long d[GRAPHSIZE]; 
int prev[GRAPHSIZE]; 

void printPath(int dest) {
    if (prev[dest] != -1)
        printPath(prev[dest]);
    printf("%d ", dest);
}

void dijkstra(int s) {
    int i, k, mini;
    int visited[GRAPHSIZE];

    for (i = 1; i <= n; ++i) {
        d[i] = INFINITY;
        prev[i] = -1; /* no path has yet been found to i */
        visited[i] = 0; /* the i-th element has not yet been visited */
    }

    d[s] = 0;

    for (k = 1; k <= n; ++k) {
        mini = -1;
        for (i = 1; i <= n; ++i)
            if (!visited[i] && ((mini == -1) || (d[i] < d[mini])))
                mini = i;

        visited[mini] = 1;

        for (i = 1; i <= n; ++i)
            if (dist[mini][i])
                if (d[mini] + dist[mini][i] < d[i]) {
                    d[i] = d[mini] + dist[mini][i];
                    prev[i] = mini;
                }
    }
}

int main(int argc, char *argv[]) {
    int i, j;
    int u, v, w;

    FILE *fin = fopen("/Users/kostistougianni/Downloads/networks/net100.txt", "r");
    fscanf(fin, "%d", &e);
    for (i = 0; i < e; ++i)
        for (j = 0; j < e; ++j)
            dist[i][j] = 0;
    n = -1;
    for (i = 0; i < e; ++i) {
        fscanf(fin, "%d%d%d", &u, &v, &w);
        dist[u][v] = w;
        n = MAX(u, MAX(v, n));
    }
    fclose(fin);

    dijkstra(1);

    printf("\n");
    for (i = 1; i <= n; ++i) {
        printf("Path to %d: ", i);
        printPath(i);
        printf("\n");
    }

    dijkstra(1);
    printf("\n");
    printf("Path from 1 to 100:");
    printPath(100);

    return 0;
}