題目描述:
假設無向圖G采用鄰接矩陣存儲,編寫一個算法求連通分量的個數。
輸入:
第一行為一個整數n,表示頂點的個數(頂點編號為0到n-1),接下來是為一個n*n大小的整數矩陣,表示圖的鄰接關系。數字為0表示不鄰接,1表示不鄰接。
輸出:連通分量的個數
相關知識:
利用圖的深度優先搜索(DFS):從圖中的某個頂點出發,訪問此頂點,然后從v的未被訪問的鄰接點出發深度優先遍歷圖,若圖中有頂點未被訪問,則另選一個未曾被訪問的頂點作為起始點,重復上述過程,直至圖中所有頂點都被訪問到為止。若是連通圖則只會執行一次,所以利用DFS對圖進行搜索,對只執行一次的連通圖進行計數,即為無向圖中連通分量的個數。
1 #include<iostream> 2 using namespace std; 3 int i,j; 4 int count=0;//統計連通分量個數 5 int visited[100];//訪問標志數組 6 //建立鄰接矩陣 7 void Create(int n,int edges[100][100]) 8 { 9 for(i=0;i<n;i++) 10 { 11 for(j=0;j<n;j++) 12 { 13 cin>>edges[i][j]; 14 } 15 } 16 } 17 //鄰接矩陣的深度優先遞歸算法 18 void DFS(int n,int edges[100][100],int i) 19 { 20 visited[i]=1;//已經訪問的標記為1 21 for(j=0;j<n;j++) 22 { 23 if(edges[i][j]==1&&visited[j]==0)//鄰接點存在且未被訪問 24 { 25 DFS(n,edges,j);//對未被訪問的鄰接頂點遞歸調用 26 } 27 } 28 } 29 //鄰接矩陣的深度遍歷操作 30 void DFSTraverse(int edges[100][100],int n) 31 { 32 for(i=0;i<n;i++) 33 { 34 visited[i]=0;//初始時,所有結點都是未被訪問的狀態,標記為0 35 } 36 for(i=0;i<n;i++) 37 { 38 if(visited[i]==0) 39 //對未被訪問的頂點調用DFS,若是連通圖,只會執行一次 40 { 41 DFS(n,edges,i); 42 count++; 43 } 44 } 45 } 46 47 int main() 48 { 49 int n; 50 int edges[100][100]; 51 cin>>n; 52 Create(n,edges); 53 DFSTraverse(edges,n); 54 cout<<count; 55 return 0; 56 }