[英]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.