2009-12-06 2 views
4

Как создать взвешенный граф C++, где каждая вершина на графике имеет вес (некоторое целочисленное значение)?C++ Создание взвешенного графика?

Вы можете скачать мой график проекта here (RapidShare):

Здесь функция для создания графика из данных графиков, хранящихся в текстовом файле:

void GraphType::createGraph() 
{ 
    ifstream infile; 
    char fileName[50]; 

    int index; 
    int vertex; 
    int adjacentVertex; 

    if(gSize != 0) 
     clearGraph(); 

    cout << "Enter input file name: "; 
    cin >> fileName; 
    cout << endl; 

    infile.open(fileName); 

    if(!infile) 
    { 
      cout << "Cannot open input file." << endl; 
      return; 
    } 

    infile >> gSize; 

    graph = new UnorderedLinkList[gSize]; 

    for(index = 0; index < gSize; index++) 
    { 
      infile >> vertex; 
      infile >> adjacentVertex; 

      while(adjacentVertex != -999) 
      { 
       graph[ vertex ].insertLast(adjacentVertex); 
       infile >> adjacentVertex; 
      } 
    } 
    infile.close(); 
} 

А вот данные Graph (число вершин = 10, вершинных 0 до 9 и смежных вершин) ввода из текстового файла "Network2.txt":

0 1 2 9 -999

1 0 2 -999

2 0 1 9 8 3 -999

3 2 8 5 -999

4 3 8 6 5 -999

5 4 6 7 -999

6 4 7 8 -999

7 8 6 5 -999

8 9 2 3 4 6 7 -999

9 0 2 8 -999

Мой вопрос, как я присвоить уникальное значение или вес к вершинам 0 до 9? Любая помощь будет действительно оценена. Заранее спасибо!

+1

Не возвращайте и не оставляйте разметку сломанной. –

+0

Хорошо, спасибо gf, я запомню это – Anthony

ответ

2

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

+0

Спасибо Nali4Freedom для ответа. Ваш ответ звучит очень интересно. Однако, после некоторых мыслей, я все еще не уверен, как реализовать его в моем проекте. Сообщите мне, если я далек от вашего решения с помощью этого кода: struct Vertex { { int numVertices; int vertex; int nearbyVertices []; int weight; }; int main() { Vertex v0; v0.vertex = 0; v0.adjacentVertices [0] = 1; v0.adjacentVertices [1] = 2; v0.adjacentVertices [2] = 9; v0.вес = 19; Vertex v1; // ... система («пауза»); } – Anthony

+0

Этот код выглядит так, будто вы придаете веса вершинам, а не границам между вершинами. Я думал об этом: http://pastebin.com/m1f8ca859, что намного проще изменить ваш код. Таким образом, каждый край имеет собственный вес. Я просто установил все весы в 1 в этом примере, вы, вероятно, захотите получить их из входного файла. –

5

Boost Graph Library (BGL) предлагает тип MutablePropertyGraph, в котором каждый край и вершина могут хранить вес как свойство. См. example here, который создает ориентированный граф с взвешенными краями.

+0

Большое спасибо Seh за то, что напомнили мне, что мне нужно начать изучать и использовать библиотеку Boost. Я загружаю его, когда пишу это и не могу дождаться, чтобы попробовать MutablePropertyGraph. К сожалению, для этого занятия я должен создать график и все его функции с нуля! Но спасибо за очень полезную ссылку! – Anthony

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