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