博主新手,最近在學習拓撲排序,查閱網上資料發現有些難懂且很多方法的**不盡相同,於是就想著試試自己能不能寫出來,經過一段時間的嘗試,最終實現了拓撲排序,現在將自己的想法發表出來,可能有些瑕疵,希望各位看後不吝賜教(不知道是不是就是網上的方法,之前看網上的沒看懂......)。
建立鄰接矩陣,輸入頂點數和邊數,初始化所有頂點間無關(用0表示),然後手動輸入有關頂點(用1表示)。
依次排查所有值,那我們可以發現:若頂點a與b之間存在關係,則有order[a][b]=1(order陣列即鄰接矩陣的陣列)且表明a是始點,b是終點。則我們要找的即為對於a的order陣列內全為0(即a只可能有出度,沒有入度)。
例:有如下圖
則輸出結果為:
以下為**(盡可能的詳細注釋了):
#include #include //動態陣列儲存拓撲排序序列
using std::cin;
using std::cout;
using std::endl;
using std::vector;
#define max 100
/*鄰接矩陣演算法*/
偶序置為零,然後迴圈檢查,最終輸出全部頂點,若輸出個數與頂點數不同,則說明有環*/
int main()
cout<
以上即為鄰接矩陣方法。
與鄰接矩陣大抵相同,建立鄰接表,不過我用鄰接表來儲存以每個頂點為入度,與其相關的節點。則這裡是由firstedge(指向邊表的指標)指標指向邊表,那麼就可以得出,若firstedge指向null,說明此頂點沒有入度相關的節點,則輸出並將其它頂點內儲存此頂點的節點刪去,不過這裡的乙個問題就是當頂點a輸出後,它在其它頂點的邊表中的位置,若在firstedge後,則要將firstedge指向它的後乙個,然後刪除,若是邊表中的第二個或以後,則要用另一指標指向a節點的前驅,然後這一指標的next指向a節點的next節點(因為firstedge指標在頂點表中,所以要在邊表內建立另乙個指標來用)。
還是以鄰接矩陣裡的圖為基礎:
則其鄰接表為(以頂點為入邊時):
那麼首先輸出0,頂點0設為已輸出,之後刪除頂點1,3,4裡的0,在第二次迴圈時,頂點3指向了null,所以輸出頂點3,依次往下迴圈進行。
知道了思路,那麼鄰接表的**也就能夠寫出來了,如下:
#include using std::cin;
using std::cout;
using std::endl;
#define max 100
typedef struct edgenode //邊表結構體
edgenode;
typedef struct //頂點表結構體
vertexnode;
typedef vertexnode adjlist[max]; //頂點表陣列,儲存頂點
typedef struct //圖結構體
graph;
void create_graph(graph *g)
while(g->edgenum--) //初始化輸入頂點間關係 }
void order(graph *g) //拓撲排序函式
if(e->next&&e->next->adjvex==g->adjlist[count].data)//如果已輸出節點在邊表中第二個或後面的
e=e->next; //往下檢查 }}
} }}
void show(graph *g) //顯示函式,顯示每個頂點的鄰接表(但此鄰接表儲存的是每個頂點的入度節點,不是出度節點)
cout<
以上便是鄰接表方法的實現。
兩種方法的思路差不多,都是先保留頂點間關係,然後在輸出後緊接著更新整個表,確保進行下一次迴圈。
拓撲排序 鄰接矩陣
include stdafx.h include include include include using namespace std define infinity int max define max vertex num 20 頂點最多個數 define length 5 頂點字元長度 鄰接...
鄰接矩陣與鄰接表
鄰接矩陣表示圖 public class graph private int vertexnum private int edgenum private int g 鄰接矩陣 public graph int vertexnum public void insertedge edge edge pu...
hdu 1285 拓撲排序(鄰接表 鄰接矩陣)
題意 給n個比賽結果,輸出拓撲排名 yy 拓撲排序,初搞,最近練鄰接表,感覺比鄰接矩陣快的多 兩個都寫了一下,竟差兩倍之多,鄰接表神物啊 鄰接表 accepted 1285 15ms 248k 1030 b c kfinder include using namespace std int ind ...