码迷,mamicode.com
首页 > 其他好文 > 详细

06-图1 列出连通集

时间:2018-11-03 12:32:39      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:nts   false   广度优先   sem   can   int   type   bool   math   

给定一个有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<stdlib.h>
  3 #define Max 10
  4 
  5 bool Visited[Max];         //全局数组,记录每个结点是否被遍历 
  6 
  7 struct GNode{
  8     int Data[Max][Max];
  9     int Nv;
 10     int Ne;
 11 };
 12 typedef struct GNode *Graph;
 13 
 14 //建立邻接矩阵存储的空图 
 15 Graph BuildGraph(int N, int E){
 16     Graph G = (Graph)malloc(sizeof(struct GNode));
 17     for(int i=0; i<Max; i++){
 18         for(int j=0; j<Max; j++){
 19             G->Data[i][j] = 0;             //0表示没有边,1表示有边
 20         }
 21     }
 22     G->Nv = N;
 23     G->Ne = E;
 24     return G;
 25 }
 26 
 27 //读入图的边 
 28 void ReadEdge(Graph G, int E){
 29     int e1, e2;
 30     for(int i=0; i<E; i++) {
 31         scanf("%d %d", &e1, &e2);
 32         G->Data[e1][e2] = 1;
 33         G->Data[e2][e1] = 1;
 34     }
 35 }
 36 
 37 //初始化Visited[]为全false 
 38 void InitVisited( ){
 39     for(int i=0; i<Max; i++){
 40         Visited[i] = false;
 41     }
 42 }
 43 
 44 //深度优先遍历
 45 void DFS(Graph G, int V){
 46     printf("%d ", V);        //访问V 
 47     Visited[V] = true;       //将Visited[V]置为已被访问过 
 48     for(int j=0; j<G->Nv; j++){      
 49         if(G->Data[V][j]==1 && Visited[j]==false){   //选出与V相连且未被访问过的结点 
 50             DFS(G, j);                               //递归地进行深度优先遍历 
 51         }
 52     }
 53 }
 54  
 55 struct QNode{
 56     int *data;
 57     int front, rear;
 58     int maxsize;
 59 };
 60 typedef struct QNode *Queue;
 61 
 62 //判断队列是否空函数 
 63 bool IsEmpty(Queue Q){
 64     return (Q->rear == Q->front);
 65 }
 66 
 67 //建立一个空队列 
 68 Queue BuildQ(int N){
 69     Queue Q = (Queue)malloc(sizeof(struct QNode));
 70     Q->data = (int*)malloc(sizeof(int)*N);
 71     Q->front = Q->rear = 0;
 72     Q->maxsize = N;
 73     return Q;
 74 }
 75 
 76 //入队函数 
 77 void AddQ(Queue Q, int X){
 78     Q->rear = (Q->rear + 1)%Q->maxsize ;
 79     Q->data[Q->rear] = X;
 80 }
 81 
 82 //出队函数 
 83 int  DeleteQ(Queue Q){
 84     Q->front = (Q->front + 1)%Q->maxsize;
 85     return Q->data[Q->front];
 86 }
 87 
 88 //广度优先遍历 
 89 void BFS(Graph G, int V){
 90     Queue Q = BuildQ(G->Nv);
 91     printf("%d ", V);           //访问V 
 92     Visited[V] = true;          //将Visited[V]置为已被访问过 
 93     AddQ(Q, V);                 //将V入队 
 94     while(!IsEmpty(Q)){         //当队列不空 
 95         int W = DeleteQ(Q);              //取出队头元素 
 96         for(int i=0; i<G->Nv; i++){           
 97             if(!Visited[i] && G->Data[W][i]==1){   //选出与队头元素相连且未被访问过的元素 
 98                 printf("%d ", i);
 99                 Visited[i] = true;
100                 AddQ(Q, i);
101             }
102         }
103     }
104 }
105 
106 int main(){
107     int N, E;
108     scanf("%d %d", &N, &E);   
109     Graph G = BuildGraph(N, E);      //建立邻接矩阵储存的图 
110     ReadEdge(G, E);                  //读入图的边 
111     InitVisited();
112     for(int i=0; i<G->Nv; i++){   
113         if(Visited[i]==false){
114             printf("{ ");
115             DFS(G, i);
116             printf("}\n");
117         }
118     }   
119     InitVisited();                //每次遍历前要将Visited[]初始化 
120     for(int i=0; i<G->Nv; i++){   
121         if(Visited[i]==false){
122             printf("{ ");
123             BFS(G, i);  
124             printf("}\n");
125         }
126     }
127     return 0;
128 }

 

 

 

06-图1 列出连通集

标签:nts   false   广度优先   sem   can   int   type   bool   math   

原文地址:https://www.cnblogs.com/shin0324/p/9900169.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!