1. 程式人生 > >列出連通集

列出連通集

pan lis ensure psu eset line begin print font

列出連通集

給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N?1編號。進行搜索時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。

輸入格式:

輸入第1行給出2個整數N(0)和E,分別是圖的頂點數和邊數。隨後E行,每行給出一條邊的兩個端點。每行中的數字之間用1空格分隔。

輸出格式:

按照"{ v?1?? v?2?? ... v?k?? }"的格式,每行輸出一個連通集。先輸出DFS的結果,再輸出BFS的結果。

輸入樣例:

8 6
0 7
0 1
2 0
4 1
2 4
3 5

輸出樣例:

{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }
 1 #include<stdio.h>
 2 #include<set>
 3 #define MAXSIZE 15
 4 using namespace std;
 5 int n,m;
 6 int visited[MAXSIZE];
 7 set<int> mp[MAXSIZE];
 8 void init(){
 9    for(int i = 0; i < MAXSIZE; i++){
10      visited[i] = 0;
11    }
12 }
13  
14 void DFS(int k){
15   if(visited[k]==1
){ 16 return ; 17 } 18 visited[k] = 1; 19 printf(" %d",k); 20 for(set<int>::iterator it = mp[k].begin(); it != mp[k].end(); it++){ 21 DFS(*it); 22 } 23 } 24 void BFS(int k){ 25 visited[k] = 1; 26 printf(" %d",k); 27 int Q[15]; 28 int last = 1; 29 int pre = 0; 30 Q[0] = k;
31 while(pre < last){ 32 int d = Q[pre]; 33 pre++; 34 for(set<int>::iterator it = mp[d].begin(); it != mp[d].end(); it++){ 35 if(visited[*it]==0){ 36 visited[*it] = 1; 37 printf(" %d",*it); 38 Q[last] = *it; 39 last++; 40 } 41 } 42 } 43 } 44 45 int main(){ 46 scanf("%d %d",&n,&m); 47 for(int i = 0; i < m; i++){ 48 int a,b; 49 scanf("%d %d",&a,&b); 50 mp[a].insert(b); 51 mp[b].insert(a); 52 } 53 init(); 54 for(int i = 0; i < n; i++){ 55 if(visited[i]!=1){ 56 printf("{"); 57 DFS(i); 58 printf(" }\n"); 59 } 60 } 61 init(); 62 for(int i = 0; i < n; i++){ 63 if(visited[i]!=1){ 64 printf("{"); 65 BFS(i); 66 printf(" }\n"); 67 } 68 } 69 return 0; 70 }

 

列出連通集