06-图1 列出连通集
Posted shin0324
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了06-图1 列出连通集相关的知识,希望对你有一定的参考价值。
给定一个有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("} "); 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("} "); 125 } 126 } 127 return 0; 128 }
以上是关于06-图1 列出连通集的主要内容,如果未能解决你的问题,请参考以下文章