当我尝试使用包含100多个边的输入文件时,为什么我的代码会崩溃?

时间:2015-06-04 14:47:10

标签: c crash dijkstra infinity

#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;
}

我的文字如下:1 5 10 1 = u, 5 = v, 10 = w

当我使用具有10-50个边缘的inout文件时,代码工作得很好。之后,当我给出一个包含100个以上边缘的输入文件时,它会发出崩溃而没有任何错误。

0 个答案:

没有答案