圖 -數據結構(C語言實現)


讀數據結構與算法分析

坑!待填!

若干定義

  • 一個圖G = (V , E)由頂點集V和邊集E組成,每條邊就是一個點對

  • 如果點對是有序的,那么就叫做有向圖

  • 邊可能還具有第三種成分,權值

  • 無向圖種從每個頂點到其他每個頂點都存在至少一天路徑,則稱為圖是連通的。具有這樣性質的有向圖稱為強連通,如果不是強連通的,但它的基礎圖是連通的,則稱為弱連通

圖的表示

領接矩陣

- 使用一個二維數組表示
- 對於每條邊(u,v),置A[u][v] = 1;

鄰接表

- 用一個表來儲存這個頂點的所有鄰接點
- 使用一個數組保存頭單元
- 每個頭單元連接着所有頂點

拓撲排序

對有向無圈的頂點的一種排序,使得如果存在從vi到vj,那么在排序中vj必須出現在vi后面

實現

簡單實現

  1. 從有向圖中選取一個沒有前驅(入度為0)的頂點,並輸出之;
  2. 從有向圖中刪去此頂點以及所有以它為尾的弧(弧頭頂點的入度減1);
  3. 重復上述兩步,直至圖空,或者圖不空但找不到無前驅的頂點為止。

類型聲明

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) ;
}
``


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM