1. 程式人生 > >通過DFS和BFS判斷無向圖是否連通

通過DFS和BFS判斷無向圖是否連通

基礎定義

無向圖:沒有方向的圖
連通圖:任意兩個頂點可以直接或者通過其他頂點走通,那麼就是連通圖,和完全圖需要區別(完全圖是需要任意兩個頂點直接有路)

遍歷圖的基本方法來判斷是否連通

DFS和BFS有的步驟都是從一個頂點開始,然後判斷該頂點是否被訪問,而且該頂點和其他頂點是否有關係,若有關係並且沒有訪問過,就往下訪問,要是無向圖是連通的,那麼這個過程會依次下去遍歷所有節點。所以通過這個特性,就可以設定一個全域性變數count去記錄,看最後count的值和頂點數是否相同,若相同則說明是無向連通圖,反之則不是。

int count = 0;
void DFS(MGrap G. int
i) { int j = 0; visited[i] = 1; count++; for(j=0; j<G.numVertexes; j++) { if(G.arc[i][j]==1 && !visited[j])//i和j有關係相鄰,並且j頂點沒有被訪問過 { DFS(G, j); } } }
int count = 0;
void BFS(MGrap G)
{
    int i,j;
    Queue Q;
    for(i=0; i<G.numVertexes; i++)/*初始化訪問陣列*/
{ visited[i] = -1; } InitQueue(&Q); for(i=0; i<G.numVertexes; i++) { if(!visited[i]) { visited[i] = 1; printf("%c",G.vexs[i]); EnQueue(&Q,i);/*入隊操作*/ while(!QueueEmpty(Q)) { DeQueue(&Q, &i); for
(j=0; j<G.numVertexes; j++) { /* 判斷當前的節點與其他節點的關係 */ if(G.arc[i][j]==1 && !visited[j]) { if(i==0)/*首先遍歷的節如果和其他邊有關係的話要加上*/ { count++; } visited[j] = 1; count++; EnQueue(&Q,j); } } } } } }

PS:這個程式碼是自己想著加的,也不知道對不對。若果不對,希望小夥伴們幫我指出來。