通過DFS和BFS判斷無向圖是否連通
阿新 • • 發佈:2019-02-06
基礎定義
無向圖:沒有方向的圖
連通圖:任意兩個頂點可以直接或者通過其他頂點走通,那麼就是連通圖,和完全圖需要區別(完全圖是需要任意兩個頂點直接有路)
遍歷圖的基本方法來判斷是否連通
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:這個程式碼是自己想著加的,也不知道對不對。若果不對,希望小夥伴們幫我指出來。