這題主要涉及到了隊列,無向圖的鄰接矩陣表示,圖的深度和廣度優先搜索。又是糙哥,參考了他的程序(http://www.cnblogs.com/liangchao/p/4288807.html),主要是BFS那塊,課件上的不太明白。有一點不太明白,圖的初始化那塊,利用傳指向圖的指針而不是通過函數返回值為什麼不行?代碼及題目如下
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdbool.h>
5
6 typedef struct MGraph
7 {
8 int vertice;
9 int * edge;
10 bool * visited;
11 }MGraph, * pMGraph;
12 typedef struct Queue
13 {
14 int * elem;
15 int head;
16 int tail;
17 int size;
18 }Queue, * pQueue;
19
20 pMGraph initGraph(int vn);
21 void link(pMGraph pG, int v1, int v2);
22 void DFS(pMGraph pG, int v);
23
24 void BFS(pMGraph pG, int v);
25 pQueue createQueue(int vn);
26 bool isEmpty(pQueue pQ);
27 void inQueue(pQueue, int v);
28 int outQueue(pQueue);
29
30 int main()
31 {
32 // freopen("in.txt", "r", stdin); // for test
33 int i, N, E;
34 scanf("%d%d", &N, &E);
35 pMGraph pG;
36 pG = initGraph(N);
37
38 int v1, v2;
39 for(i = 0; i < E; i++)
40 {
41 scanf("%d%d", &v1, &v2);
42 link(pG, v1, v2);
43 }
44
45 for(i = 0; i < N; i++)
46 {
47 if(!pG->visited[i])
48 {
49 printf("{ ");
50 DFS(pG, i);
51 printf("}\n");
52 }
53 }
54 memset(pG->visited, false, pG->vertice * sizeof(bool));
55 for(i = 0; i < N; i++)
56 {
57 if(!pG->visited[i])
58 {
59 printf("{ ");
60 BFS(pG, i);
61 printf("}\n");
62 }
63 }
64 // fclose(stdin); // for test
65 return 0;
66 }
67
68 pMGraph initGraph(int vn)
69 {
70 int len;
71 len = vn * (vn - 1) / 2;
72
73 pMGraph pG;
74 pG = (pMGraph)malloc(sizeof(MGraph));
75 pG->vertice = vn;
76 pG->edge = (int *)malloc(len * sizeof(int));
77 memset(pG->edge, 0, len * sizeof(int));
78 pG->visited = (bool *)malloc(vn * sizeof(bool));
79 memset(pG->visited, false, vn * sizeof(bool));
80
81 return pG;
82 }
83
84 void link(pMGraph pG, int v1, int v2)
85 {
86 int index;
87
88 if(v1 > v2)
89 {
90 v1 += v2;
91 v2 = v1 - v2;
92 v1 -= v2;
93 }
94 index = v2 * (v2 - 1) / 2 + v1;
95 pG->edge[index] = 1;
96 }
97
98 void DFS(pMGraph pG, int v)
99 {
100 int row, col, index;
101
102 pG->visited[v] = true;
103 printf("%d ", v);
104 for(col = 0; col < v; col++)
105 {
106 index = v * (v - 1) / 2 + col;
107 if(pG->edge[index] && pG->visited[col] == false)
108 DFS(pG, col);
109 }
110 for(row = v + 1; row < pG->vertice; row++)
111 {
112 index = row * (row - 1) / 2 + v;
113 if(pG->edge[index] && pG->visited[row] == false)
114 DFS(pG, row);
115 }
116 }
117
118 void BFS(pMGraph pG, int v)
119 {
120 pQueue pQ;
121 pQ = createQueue(pG->vertice);
122
123 int row, col, index;
124 pG->visited[v] = true;
125 printf("%d ", v);
126 inQueue(pQ, v);
127 while(!isEmpty(pQ))
128 {
129 v = outQueue(pQ);
130 for(col = 0; col < v; col++)
131 {
132 index = v * (v - 1) / 2 + col;
133 if(pG->edge[index] && pG->visited[col] == false)
134 {
135 pG->visited[col] = true;
136 printf("%d ", col);
137 inQueue(pQ, col);
138 }
139 }
140 for(row = v + 1; row < pG->vertice; row++)
141 {
142 index = row * (row - 1) / 2 + v;
143 if(pG->edge[index] && pG->visited[row] == false)
144 {
145 pG->visited[row] = true;
146 printf("%d ", row);
147 inQueue(pQ, row);
148 }
149 }
150 }
151 }
152
153 pQueue createQueue(int vn)
154 {
155 pQueue pQ;
156 pQ = (pQueue)malloc(sizeof(Queue));
157 pQ->size = vn + 1;
158 pQ->head = pQ->tail = 0;
159 pQ->elem = (int *)malloc(pQ->size * sizeof(int));
160
161 return pQ;
162 }
163
164 bool isEmpty(pQueue pQ)
165 {
166 if(pQ->head != pQ->tail)
167 return false;
168 else
169 return true;
170 }
171
172 void inQueue(pQueue pQ, int v)
173 {
174 pQ->tail = (pQ->tail + 1) % pQ->size;
175 pQ->elem[pQ->tail] = v;
176 }
177
178 int outQueue(pQueue pQ)
179 {
180 pQ->head = (pQ->head + 1) % pQ->size;
181
182 return pQ->elem[pQ->head];
183 }
For a given undirected graph with N vertices and E edges, please list all the connected components by both DFS and BFS. Assume that all the vertices are numbered from 0 to N-1. While searching, assume that we always start from the vertex with the smallest index, and visit its adjacent vertices in ascending order of their indices.
Input Specification:
Each input file contains one test case. For each case, the first line gives two integers N (0<N<=10) and E, which are the number of vertices and the number of edges, respectively. Then E lines follow, each described an edge by giving the two ends. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print in each line a connected component in the format "{ v1 v2 ... vk }". First print the result obtained by DFS, then by BFS.
Sample Input:
8 6 0 7 0 1 2 0 4 1 2 4 3 5
Sample Output:
{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }