乙個簡單的求拓撲排序思路是:先找出任意乙個沒有入邊的頂點。然後列印出該頂點,並將它和它的邊一起從圖中刪除。然後,我們對圖的其餘部分採用同樣的方法處理。相應的我們可以定義乙個indegree(入度陣列)儲存所有頂點的入度。具體實現如下(鄰接表):
#define _crt_secure_no_warnings
#include#include#include#define max_szie 100
#define max 0x7fffffff
typedef struct node
vertex, *pvertex;
typedef struct graph
graph;
// 新增鄰接表的結點
pvertex addnewnode(int verinfo)
// 輸入圖的頂點數,和邊數
void inputvertexnumandedgenum(graph *g)
// 輸入頂點
void inputedge(graph *g)
p->pnext = addnewnode(--t2); }}
// 建立圖
void creategraph(graph *g)
// 顯示圖
void displaygraph(graph *g)
printf("\n"); }}
// 圖的遍歷
void bfs(graph *g, int start)
; pvertex queue[max_szie] = ;
int rear = 0, front = 0;
queue[rear++] = g->list[start];
vis[g->list[start]->verinfo] = 1;
while (front != rear)
temp = temp->pnext;
} }}// 初始化入度陣列
int *initindegree(graph *g,int n)
// 獲得入度陣列
void getindegree(graph *g,int *indegree)
}} indegree[i] = count;
} printf("各個頂點的入度為\n");
for (i = 0; i < g->vertexnum; i++)
printf("%d ", indegree[i]);
printf("\n");
}// 找到入度陣列中為0的頂點,並判斷圖是否有環
int findnewvertexofindegreezero(int *indegree,int n)
} if (1 == flag)
return i;
return -1;
}// 拓撲排序
void topsort(graph *g, int *indegree)
topnum[i] = v + 1;
p = g->list[v]->pnext;
while (p != null)
}printf("圖的乙個拓撲排序結果為\n");
for (i = 0; i < n; i++)
printf("%d ", topnum[i]);
free(topnum);
}void reversal(int *arr, int n1, int n2)
}// 拓撲排序用到佇列
void topsortbyqueue(graph *g, int *indegree)
while (front != rear)
p = p->pnext;
} // 在這個地方錯了好久,最後才發現,照上面的輸入v7先入隊,v3後入隊,然後v7出隊,v3出隊
// 但正確的出隊順序是v3,v7
if (temp > 1)
}if (count != n)
printf("\n圖的乙個拓撲排序結果為\n");
資料結構之拓撲排序
拓撲排序 topological order 是指,將乙個有向無環圖 directed acyclic graph簡稱dag 進行排序進而得到乙個有序的線性序列。這樣說,可能理解起來比較抽象。下面通過簡單的例子進行說明!例如,乙個專案包括a b c d四個子部分來完成,並且a依賴於b和d,c依賴於d...
資料結構之拓撲排序
感覺重點就是鄰接表的建立和tp toposort 函式中的乙個變數 的變化很奇妙,相當於是乙個靜態指標的用法。include include include include include include include include include define inf 0x3f3f3f3f d...
資料結構之拓撲排序
一 什麼是拓撲排序 在圖論中,拓撲排序 topological sorting 是乙個有向無環圖 dag,directed acyclic graph 的所有頂點的線性序列。且該序列必須滿足下面兩個條件 每個頂點出現且只出現一次。若存在一條從頂點 a 到頂點 b 的路徑,那麼在序列中頂點 a 出現在...