PTA Data Structures and Algorithms (English) 6-14
阿新 • • 發佈:2021-01-20
6-14Count Connected Components(20point(s))
Write a function to count the number of connected components in a given graph.
Format of functions:
int CountConnectedComponents( LGraph Graph );
whereLGraph
is defined as the following:
typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{ Vertex AdjV; PtrToAdjVNode Next; }; typedef struct Vnode{ PtrToAdjVNode FirstEdge; } AdjList[MaxVertexNum]; typedef struct GNode *PtrToGNode; struct GNode{ int Nv; int Ne; AdjList G; }; typedef PtrToGNode LGraph;
The functionCountConnectedComponents
is supposed to return the number of connected components in the undirectedGraph
.
Sample program of judge:
#include <stdio.h> #include <stdlib.h> typedef enum {false, true} bool; #define MaxVertexNum 10 /* maximum number of vertices */ typedef int Vertex; /* vertices are numbered from 0 to MaxVertexNum-1 */ typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{ Vertex AdjV; PtrToAdjVNode Next; }; typedef struct Vnode{ PtrToAdjVNode FirstEdge; } AdjList[MaxVertexNum]; typedef struct GNode *PtrToGNode; struct GNode{ int Nv; int Ne; AdjList G; }; typedef PtrToGNode LGraph; LGraph ReadG(); /* details omitted */ int CountConnectedComponents( LGraph Graph ); int main() { LGraph G = ReadG(); printf("%d\n", CountConnectedComponents(G)); return 0; } /* Your function will be put here */
Sample Input (for the graph shown in the figure):
8 6
0 7
0 1
2 0
4 1
2 4
3 5
Sample Output:
3
static int visited[MaxVertexNum]; void DFS( LGraph Graph, Vertex v) { PtrToAdjVNode node; if(visited[v]) return ; visited[v] = true; node = Graph->G[v].FirstEdge; while(node) { DFS(Graph, node->AdjV); node = node->Next; } } int CountConnectedComponents( LGraph Graph ) { int count = 0; for(int i = 0; i < Graph->Nv; i++) visited[i] = false; for(int i = 0; i < Graph->Nv; i++) { if(!visited[i]) { DFS(Graph, i); count++; } } return count; }
思路:
圖的深度遍歷,每一趟訪問一個連通分量,趟數就是結果,時間複雜度是O(V+E)。