给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N-1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0<N≤10)和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 /* 图的邻接矩阵表示简化法*/ 2 #include <iostream> 3 #include <cstdio> 4 #include <queue> 5 using namespace std; 6 7 #define MaxSize 10 8 9 int graph[MaxSize][MaxSize], Nv, Ne;//Nv顶点数 Ne边数 10 int check[MaxSize]; 11 void buildGraph() 12 { 13 int v1,v2; 14 scanf("%d %d",&Nv, &Ne); 15 for(int i = 0; i < Nv; i++){ 16 check[i] = 0; 17 for(int j = 0; j < Ne; j++) 18 graph[i][j] = 0; 19 } 20 21 for(int i = 0; i < Ne; i++) { 22 scanf("%d %d",&v1, &v2); 23 graph[v1][v2] = 1; //1有边 24 graph[v2][v1] = 1; 25 } 26 } 27 int checkVisited() 28 { 29 int i; 30 for(i = 0; i < Nv; i ++){ 31 if( !check[i] ) 32 break; 33 } 34 if(i == Nv) //如果都被访问了 35 return -1; 36 return i; 37 } 38 39 void clearCheck() 40 { 41 for(int i = 0; i < Nv; i++) 42 check[i] = 0; 43 } 44 45 int BFS() 46 { 47 queue<int> queue; 48 int i,j; 49 i = checkVisited(); 50 if( i == -1 ) 51 return -1; 52 queue.push(i); 53 check[i] = 1;//该顶点已访问 54 printf("{ %d ",i); 55 while( !queue.empty() ) { 56 int tempi = queue.front(); 57 queue.pop(); 58 for(j = 0; j < Nv; j++) 59 if(graph[tempi][j] == 1 && !check[j]) { 60 check[j] = 1;//该顶点已访问 61 printf("%d ",j); 62 queue.push(j); 63 } 64 } 65 printf("}\n"); 66 return BFS(); 67 } 68 69 void DFS(int Vi) 70 { 71 check[Vi] = 1; 72 printf("%d ",Vi); 73 for(int j = 0; j < Nv; j++) { 74 if(graph[Vi][j] == 1 && !check[j]) 75 DFS(j); 76 } 77 } 78 int listDFS() 79 { 80 if( checkVisited() == -1 ) 81 return -1; 82 printf("{ "); 83 DFS( checkVisited() ); 84 printf("}\n"); 85 return listDFS(); 86 } 87 int main() 88 { 89 buildGraph(); 90 listDFS(); 91 clearCheck(); 92 BFS(); 93 return 0; 94 }
时间: 2024-11-07 19:40:16