簡體   English   中英

確定無向圖是否為樹

[英]Determine if an undirected Graph is a tree

我對有向圖和無向圖進行了研究。 我的方法是使用DFS算法。 我知道當visitedM[iVertices]true或兩次訪問該節點時,這表示它不是樹。 我還使用以下定理確定圖是否為樹。

Theorem: Any connected graph with n vertices and n-1 edges is a tree

我的代碼通過從文件中讀取如下所示的頂點數和邊數來初始化

6 7
1 2
1 5
1 6
2 5

如您所見,每一條邊都在源頂點和目標頂點的一行上列出。 頂點從1開始。邊沿是無向的,並且一旦以最小的頂點ID開始,就會在文件中列出。 例如,對於邊緣2-5和5-2,文件將只有2-5。

我的問題是我不知道是否應該分配節點內存,如何將節點插入圖中,如何從DFS代碼中告訴我不是樹。 我也有void dfs作為返回返回已訪問頂點計數的int函數。 int dft(grapg *g, int iV, int VisitedM[]) 該函數類似於我的void DFS ,但是如果visitedM[iV]visitedM[iV] = TRUE則返回0,並返回iCount 我還假定我的數據結構是混亂的。

#define MAX_VERTICES 100
typedef struct EdgeNode
{
    int y;
    int w;          //weight
    int iVertex     //susbcript in vertexM for TO Vertex
    struct EdgeNode *pNextEdge;
}EdgeNode;

typedef struct Vertex
{
    char szLabel[100 +1 ];
    EdgeNode *successorList;
}Vertex;

typedef struct
{
    int iNumVertices;
    int iNumEdges;
    int iDirected;
    Vertex vertexM[MAX_VERTICES +1];

    int iParent[MAX_VERTICES + 1];
    int iVisitedM[MAX_VERTICES + 1];

    int degree[MAX_VERTICES + 1];
    EdgeNode *edge[MAX_VERTICES +1];
}GraphImp;
typedef GraphImp *Graph;


    int main(int argc, char *argv[])
    {
        FILE *pFile;
        Graph graph;
        char szInputBuffer[100];
        int numEdges, numVertices;
        pFile = fopen("a.txt","r");

        if( pFile == NULL)
        {
            printf("FILE DOES NOT EXIST \n");
            return;
        }
        //reads file until EOF
        while(fscanf(pFile, "%d%d", &graph.iVertices, &graph.iEdges) != EOF)
        {
            //printf is to track the input from file
            printf("num of vertices: %d \n num of edeges: %d \n",graph.iVertices, graph.iEdges);
        }

        fclose(pFile);
    }
            void dft(Graph *g, int iV, int visitedM[])
        {
            EdgeNode *e;
            if(visitedM[iV])
                return;
            for( e = g->vertexM[iV].sucessorList; e!= NULL; e = e->pNextEdge)
            {
                dft(g, e->iVertex, visitedM);
            }
        }

讓我給您一個稍微不同的方法來解決這個問題。

給定問題{{6,7}, {1,2}, {1,5}, {1,6}, {2,5}} ,有5個頂點{1,2,5,6,7}和5條邊。 我們立即得出結論,該圖不能為樹,因為根據該定理,具有5個頂點的圖必須具有4個邊。

要使問題更加棘手,請除去其中一個邊,留下{{6,7}, {1,2}, {1,6}, {2,5}} 現在我們有正確的邊數,因此根據該定理,我們只需要證明圖是連通的即可 這可以通過為圖形着色來完成。


要為圖形着色,請實現這三個規則

  • 如果邊緣連接兩個未着色的頂點,請為這些頂點賦予新的顏色
  • 如果邊將有色頂點連接到無色頂點,則將顏色分配給無色頂點
  • 如果一條邊連接兩個不同顏色的頂點,則將這些顏色合並為一種顏色

如果每個頂點都具有相同的顏色,則表示該圖已連接。


下表顯示了在處理每個邊緣時顏色分配如何隨時間變化。

       |     color assignments 
vertex | start {6,7} {1,2} {1,6} {2,5} 
-------+-------------------------------
  1    |   0     0     2     1     1
  2    |   0     0     2     1     1
  3    |   0     0     0     0     0
  4    |   0     0     0     0     0
  5    |   0     0     0     0     1
  6    |   0     1     1     1     1
  7    |   0     1     1     1     1

首先,所有頂點都是未着色的,由數字0表示。第一個邊沿{6,7}為頂點6和7分配新顏色。第二個邊沿{1,2}為頂點1分配新顏色。和2.第三個邊緣{1,6}連接具有不同顏色的頂點,因此所有具有顏色2的頂點都將更改為顏色1。最后一個邊緣{2,5}連接有色頂點和無色頂點,因此顏色1分配給頂點5。

在處理完所有邊之后,所有着色頂點具有相同的顏色,因此將圖形連接起來。 同樣,邊的數量比頂點的數量少一。 因此,該圖是一棵樹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM