Swust OJ1065: 無向圖的連通分量計算


題目描述:
假設無向圖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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM