2011-01-23 26 views
1

我不能決定,如何在C++中定義圖。圖論 - 切換樹成員

現在,我有2維數組:

A - B,D 
B - A 
C - D 
D - A,C 

alt text

但是我的麻煩是當我想切換一些圖的 「成員」(例如d和A)。我知道我需要這樣的事情(我可以​​手動從圖形圖像):

A - C,D 
B - D 
C - A 
D - A,B 

alt text

但我居然不知道,怎麼寫的算法,這將是能夠改變二維數組的順序,因爲它不像重新排序一維數組那麼簡單。

+2

您繪製圖表的方式意味着*指向*圖形,但是您描述數組的方式意味着*無向圖形。這是什麼? – 2011-01-23 21:31:52

+0

如果你想建立一個鏈表,爲什麼不建立一個鏈表呢? – 2011-01-23 21:32:30

+0

我沒有提到 - 它是無向圖。 – 2011-01-23 21:34:33

回答

0

有兩種常見的方式來表示數據中的圖形。第一個是一組對,其中第一個和第二個都是頂點。如果對存在,則存在邊緣btween該對中的兩個頂點:

std::set<std::pair<int, int> > setMyGraph; 

第二使用稱爲鄰接矩陣的數據結構。該矩陣列出行和列上的頂點,並且如果頂點x和頂點y之間存在邊,則位置(x,y)保持爲真。否則它會成爲錯誤。

vector<vector<bool> > vMyGraph; 
1

如果你只是想找一種方法來表示你的圖表,以便完成你的工作,可以考慮boost :: graph。

當我允許用戶將一個頂點拖動到另一個頂點以合併它們時,我必須做些輕微的相似操作。我做這件事的方式,你可能需要做同樣的事情,就是跟蹤邊緣,將它們的描述存儲在臨時(我有數據附加到圖表中),刪除其中一個頂點(你會可能不得不這樣做),然後重建需要重建的圖的部分......但現在不同了。

1

如果您使用索引而不是指針來引用鄰居,那麼您可以簡單地交換A和D並保持邊緣不變。換句話說,從

0 (A) - 1, 3 
1 (B) - 0 
2 (C) - 3 
3 (D) - 0, 1 

2D陣列更改爲

0 (D) - 1, 3 
1 (B) - 0 
2 (C) - 3 
3 (A) - 0, 1 

編輯:無論使用指針或沒有,你的曲線圖是由各自含有的值的節點序列(A描述,本例中的B,C或D)以及對鄰居節點的引用。這些引用可以是索引到節點數組(如我的示例中)或指向鄰居節點的指針。不管鄰居引用的表示如何,您只需交換並保持鄰居引用不變。