Как я могу оптимизировать этот структурный код dijkstra? - PullRequest
0 голосов
/ 28 июня 2010

Это структура dijkstra, которую я использую: (однако MAXV (максимальное число вершин максимально при 500, и каждый раз, когда я пытаюсь изменить его на что-то большее, оно генерирует ошибку при работе)

-Я хочу использовать этот способ для представления графа с 10000 вершинами, кто-нибудь знает, как его оптимизировать?

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
using namespace std;
#define MAXV 500
#define MAXINT 99999
typedef struct{
        int next;
        int weight;
}edge;
typedef struct{
        edge edges[MAXV][MAXV];
        int nedges;
        int nvertices;
        int ndegree[MAXV];
}graph;

и это мой код dijkstra:

int dijkstra(graph *g,int start,int end){
    int distance[MAXV];
    bool intree[MAXV];
    for(int i=0;i<=MAXV;++i){
            intree[i]=false;
            distance[i]=MAXINT;
    }
    int v=start;
    distance[v]=0;
    while(intree[v]==false){
           intree[v]=true;
           for(int i=0;i<g->ndegree[v];++i){
                   int cand=g->edges[v][i].next;
                   int weight=g->edges[v][i].weight;
                   if(distance[cand] > distance[v]+weight){
                           distance[cand] = distance[v]+weight;
                   }
           }
           int dist=MAXINT;
           for(int i=0;i<g->nvertices;++i){
                   if((intree[i]==false) && (dist > distance[i])){
                           dist=distance[i];
                            v=i;
                   }
           }
    }
    return distance[end];
}

1 Ответ

1 голос
/ 28 июня 2010

Используйте списки смежности для хранения графика.Прямо сейчас вы используете матрицу смежности , что означает, что вы выделяете MAXV*MAXV*sizeof(edge) байт только для этого.Это много, когда MAXV равно 10 000, так что вы, вероятно, получаете ошибку сегментации.Переключение на списки смежности избавит от ошибки.

Однако, даже со списками смежности, алгоритм Dijkstra, который у вас есть сейчас, равен O(n^2), где n - это количество узлов.Это все еще много для 10 000 узлов.Рассмотрите возможность реализации Dijkstra с кучами (также здесь ), если вам необходимо поддерживать такое количество узлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...