2013-11-18 4 views
1

В настоящее время я пытаюсь создать программу для алгоритма Дейкстры. У меня возникли проблемы с пониманием того, как создать график для алгоритма.алгоритм dijkstra с использованием матрицы смежности

У меня возникли проблемы с реализацией этого графика.

Я хочу создать функцию, называемую

add_edge(G, Source, destination, weight); 

Я хочу использовать эту функцию, чтобы создать свой график таким образом, я могу позже создать случайный граф. Например, я хотел бы сделать это:

add_edge(G,1,2,3); 
add_edge(G,1,6,5); 
add_edge(G,2,3,7); 
etc. 

Первое, что я думаю сделать, это создать G, но я не уверен в том, как это сделать. Я имею в виду, чтобы сделать еще одну функцию, называемую конструкцию, которая была бы равна G, такие как:

G = construct(Vertices); 

Я просто уверен в том, как построить это.

Если кто-то может помочь мне понять эти две функции, это будет большой помощью!

+0

IMO матрица, что вы показали, можно увидеть в виде графика, как это имеет всю информацию, содержащуюся в нем. –

+0

Мне жаль, но я не понимаю, что вы имеете в виду. – user081608

+0

Сама матрица представляет весь график, где матрица [i] [j] - это стоимость направленного ребра от узла i до узла j. –

ответ

3

Это один из способов сделать пй х пу массив целых чисел:

int **construct(int nx, int ny) { 
    int **a = malloc(nx * sizeof(*a)); 
    for(int i = 0; i != ny; i++) { 
     a[i] = calloc(ny, sizeof(int)); 
    } 
    return a; 
} 
2

Что G ...? Есть G Ваш ? Или Gmatrix, который вы используете для представления своего графика? Было бы больше смысла, чтобы иметь что-то вроде следующего (псевдо):

// This is your graph, represented by a 2-d array. 
// i would be your source (vertex) 
// j would be your destination (vertex) 
// graph[i][j] would be the weight of the edge between those two points 

int graph[][]; 

// Then you could add an edge to your graph with the following: 

add_edge(graph, source, destination, weight) { 
    graph[source][destination] = weight; 
} 

// A specific example would be: 

add_edge(graph, 10, 11, 5) 

Хотя вы должны знать: 2-мерные массивы в C фактически массив указателей типа p.

так ответ int **graph;

знакомства Чарли о том, как (в частности) создать matrix of ints.

+0

G был бы моим графиком – user081608

+0

@ user081608 Что я имею в виду ... что такое ** структура ** 'G'? Является ли 'G'' матрицей ints' ('2-d array')? Или G - это какой-то «список вершин», где у вас есть «struct Vertex»? –

2

Если вы собираетесь сделать график с использованием матрицы, перейдите к вышеупомянутым ответам. В противном случае, если вы собираетесь построить его с помощью структур, возможно, что-то подобное может вы начали

typedef struct VertexT *VertexP; 
struct VertexT 
{ 
    /*the value of the current Vertex*/ 
    int vertex; 

    /*pointer to a list of edges, each value being an end point since this 
    is a directed graph*/ 
    EdgeP edges; 

    /*pointer to a list of weights, each weight corresponding to each edge 
    thus there should be an equal number of items in both lists or there 
    is an error condition*/ 
    WeightP weights; 
} 

typedef struct GraphT *GraphP; 
struct GraphT 
{ 
    /*pointer to a list of vertices in the graph, should contain exactly 
    n vertices, where n is the number of nodes in the graph*/ 
    VertexP vertices; 
} 

Это отнюдь не единственный способ сделать это, но я хотел, чтобы обеспечить способ STRUCT в качестве альтернативы используя строго матрицы. Если это разреженный граф, использование списков может оптимизировать сложность пространства по сравнению с матрицей. Надеюсь, это поможет вам начать.

Примечание: Я использовал typedefs, потому что обнаружил, что использование VertexP или GraphP легче читать и понимать, чем struct * VertexT и struct * GraphT, это больше похоже на стилистику.

Только что просмотрел ваши изменения относительно функции addEdge(). Если бы вы собирались с моим представлением, вы можете посмотреть на псевдокоде как что-то вроде этого:

addEdge(GraphP g, int source, int dest, int weight) 
    test for g being null: 
      if true, create a graph or throw exception 
      if false, continue 
    search for source in VertexP list: 
      if true, 
       search for dest in edges 
        if true report error 
        if false add new edge and weight to list on the source VertexP 
      if false, create new VertexP with source, dest, weight and add to list 
+0

Я забыл самую важную часть VertexT, идентификатор самой вершины. Добавлено из начальных строк сообщения 4-5 в кодовом блоке, чтобы указать это. –

+0

Извините за изменения, изучая одновременно тест, ребра и веса должны быть самими структурами, содержащими значения int и указатель на следующий край и вес в списке, поэтому их следует вводить как сами структуры, а не как int. –

+0

Мне действительно нравится этот ответ, гораздо больше, чем «матричное» решение. На мой взгляд, лучше всего попытаться решить проблемы на самом высоком уровне абстракции - в этом случае создание «struct Vertex», обладающее свойствами, является хорошим способом моделирования того, как они могут быть представлены в «Графе». Лично объектно-ориентированный или прототипирующий стиль более уместен и более понятен, чем скажем * матрица ints *. Хотя у обоих есть свои сильные стороны - «матрица» в этом случае более эффективна, но «структуры» становятся более читабельными, поскольку они «переводят на английский» лучше. –

Смежные вопросы