Write a function to count the number of connected components in a given graph.
Format of functions:
int CountConnectedComponents( LGraph Graph );
where LGraph 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 function CountConnectedComponents is supposed to return the number of connected components in the undirected Graph.
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
Sample Solution:
并查集判连通子图即可。
int find(int x, int f[]){
return (x == f[x]) ? x : (f[x] = find(f[x], f));
}
int CountConnectedComponents( LGraph Graph ){
int f[MaxVertexNum];
for(int i = 0; i < Graph -> Nv; i++) f[i] = i;
for(int i = 0; i < Graph -> Nv; i++){
int x = i, y;
for(PtrToAdjVNode p = Graph -> G[i].FirstEdge; p != NULL; p = p -> Next){
y = p -> AdjV;
int fx = find(x, f), fy = find(y, f);
if(fx != fy) f[fx] = fy;
}
}
int ans = 0;
for(int i = 0; i < Graph -> Nv; i++){
if(f[i] == i) ans++;
}
return ans;
}