列出连通集

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:

输入第1行给出2个整数N(0)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:

按照"{ v1​​ v2​​ ... vk​​ }"的格式,每行输出一个连通集。先输出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<stdlib.h>
  3  
  4 #define MAXN 15
  5 int visited[MAXN] = {0};
  6  
  7 //建立邻接矩阵 //Create Graph
  8 int G[MAXN][MAXN]={0},NV,NE;
  9  
 10 void BuildGraph()
 11 {
 12     //freopen("test1.txt","r",stdin); 
 13     int i,j,v1,v2;
 14     
 15     scanf("%d%d",&NV,&NE);
 16     
 17     for( i=0; i<NE; i++)
 18     {
 19         scanf("%d%d",&v1,&v2);
 20         //InsertEdge
 21         G[v1][v2] = 1;
 22         G[v2][v1] = 1;
 23     }
 24 }
 25 //DFS
 26 void DFS(int v)
 27 {
 28     visited[v] = 1;
 29     printf("%d ",v);//输出这个点 
 30     for(int i=0; i<NV; i++)
 31     {
 32         if(G[v][i] && !visited[i])//如果联通这个点且没有访问过 
 33         {
 34             DFS(i);
 35         }
 36     }
 37 } 
 38  
 39 void ListComponentsDFS()
 40 {
 41     int i;    
 42     for(i=0; i<NV; i++)
 43     {
 44         if(!visited[i])
 45         { 
 46             printf("{ "); 
 47             DFS(i);
 48             printf("}\n");
 49         }
 50     }
 51 }
 52 //初始化visited
 53 void isvisited()
 54 {
 55     for(int i=0; i<MAXN; i++)
 56     {
 57         visited[i] = 0;
 58     }
 59 } 
 60  
 61 //BFS
 62 void BFS(int v)
 63 {
 64     //队列
 65     const int MAXSIZE=100;
 66     int quene[MAXSIZE];
 67     int first = -1, rear = -1; 
 68     quene[++rear] = v;//入队 
 69     visited[v] = 1;
 70     
 71     while(first < rear)//队列不为空
 72     {
 73         int de = quene[++first];//出队
 74         printf("%d ",de);
 75         for(int i=0; i<NV; i++)
 76         {
 77             if(!visited[i]&&G[de][i])
 78             {
 79                 visited[i] = 1;
 80                 quene[++rear] = i;
 81             }
 82         } 
 83     } 
 84     
 85 }
 86  
 87  
 88 void ListComponentsBFS()
 89 {
 90     int i;    
 91     for(i=0; i<NV; i++)
 92     {
 93         if(!visited[i])
 94         {
 95             printf("{ "); 
 96             BFS(i);
 97             printf("}\n");
 98         }
 99     }
100 }
101  
102 int main()
103 {
104  
105     //建图
106     BuildGraph();
107     //DFS遍历连通集
108     ListComponentsDFS();
109     isvisited();
110     //BFS遍历连通集 
111     ListComponentsBFS();
112     
113     return 0;
114 }
115 

转自https://blog.csdn.net/clannadandaria/article/details/51209828

posted on 2019-02-26 22:26  Esther6  阅读(143)  评论(0)    收藏  举报

导航