程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 06-圖1 List Components,06-components

06-圖1 List Components,06-components

編輯:關於C語言

06-圖1 List Components,06-components


這題主要涉及到了隊列,無向圖的鄰接矩陣表示,圖的深度和廣度優先搜索。又是糙哥,參考了他的程序(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 }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved