讀數據結構與算法分析
若干定義
- 一個圖G = (V , E)由頂點集V和邊集E組成,每條邊就是一個點對
- 如果點對是有序的,那么就叫做有向圖
- 邊可能還具有第三種成分,權值
- 無向圖種從每個頂點到其他每個頂點都存在至少一天路徑,則稱為圖是連通的。具有這樣性質的有向圖稱為強連通,如果不是強連通的,但它的基礎圖是連通的,則稱為弱連通
圖的表示
領接矩陣
- 使用一個二維數組表示
- 對於每條邊(u,v),置A[u][v] = 1;
鄰接表
- 用一個表來儲存這個頂點的所有鄰接點
- 使用一個數組保存頭單元
- 每個頭單元連接着所有頂點
拓撲排序
對有向無圈的頂點的一種排序,使得如果存在從vi到vj,那么在排序中vj必須出現在vi后面
實現
簡單實現
- 從有向圖中選取一個沒有前驅(入度為0)的頂點,並輸出之;
- 從有向圖中刪去此頂點以及所有以它為尾的弧(弧頭頂點的入度減1);
- 重復上述兩步,直至圖空,或者圖不空但找不到無前驅的頂點為止。
類型聲明
typedef char VertexType ;
typedef struct OutNode *Degree ;
typedef struct GVertex *Vertex ;
struct OutNode
{
VertexType Date ;
Degree Next ;
}
struct GVertex
{
int in ;
VertexType Date ;
Degree First ;
}
主函數
int Getin(Vertex G)
{
int len = 0;
while((G++)->Data != '/0')
len ++ ;
return len ;
}
void TopSort(Vertex G)
{
int i,j,k ;
Degree P;
int VertexNum ;
VertexNum = Getin(G) ;
for(i = 0; i < VertexNum; i++)
for(j = 0;j < VertexNum; j++)
if(G[j].in === 0)
{
printf("%c ", G[j].data);
G[j].in = -1;
P = G[j].first ;
while(P != NULL)
{
for( k=0; k<VertexNum; k++ )
if( P->data == G[k].data ) {
G[k].in--;
break;
}
P = P->next;
}
break ;
}
}
無權單源最短路算法
基本思路:按照BFS的思路搜索圖,並記下路徑長
void Unweihted(Table T)
{
int CurrDist ;
Vertex V, W ;
for(Currist = 0; Currist < NumVertex; Currist++)
for each vertex V
if(!T[v].Known && T[v].Dist == Currist)
{
T[v].Known = True ;
for each W adjacent to V
if(T[W].Dist == Infinity)
{
T[W].Dist = CurrDist + 1 ;
T[W].Path = V ;
}
}
}
更高效率的
void Unweighted(Table T)
{
Queue Q ;
Vertex V, W ;
Q = CreateQueue(NumVertex) ;
MakeEmpty(Q) ;
while(!IsEmpty(Q))
{
V = Dequeue(Q) ;
T[V].Known = True ;
for each W adjacent to V
if(T[W].Dist == Infinity)
{
T[W].Dist == T[W].Dist + 1;
T[W].Path = V ;
Enqueue(W,Q) ;
}
}
DisposeQueue(Q) ;
}
DFS深度優先搜索模板
void dfs(Vertex V)
{
Visited[V] = True ;
for each W adjacent to V
if(!Visted[W])
dfs(W) ;
}
``
