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
#include<stdio.h>
#include<stdlib.h>
int Qp = 0,top = 0,end = 1;
typedef struct {
int Visited[10];
int Edges[10][10];
int VertexN,EdgeN;
}Graph;
int DFS(Graph* G,int V);
int InitializeG(Graph* G);
int ReadG(Graph* G);
int DeleteQ(int* Q);
int AddQ(int* Q,int k);
int Find(int* Q,int k);
int BFS(Graph* G,int* Q,int v);
int main(){
int k = 0,i,p;
Graph* G;
G = (Graph*)malloc(sizeof(Graph));
InitializeG(G);
ReadG(G);
p = 0;
do{
printf("{ ");
DFS(G,k);
printf("}\n");
for(i = 0,p = 0;i<G->VertexN;p = 0,i++)
if(0 == G->Visited[i]){
p = 1;
k = i;
break;
}
}while(p);
for(i = 0,p = 0;i<G->VertexN;i++){
G->Visited[i] = 0;
}
int Q[10] = {0};
k = p = 0;
do{
printf("{ ");
// 注意队列的初始化
Qp = 0;
top = 0;
end = 1;
BFS(G,Q,k);
printf("}\n");
for(i = 0,p = 0;i<G->VertexN;p = 0,i++)
if(0 == G->Visited[i]){
p = 1;
k = i;
break;
}
}while(p);
return 0;
}
int BFS(Graph* G,int* Q,int v){
int i,j,k;
AddQ(Q,v);
for(i = v;end != top;){
for(j = 0;j<G->VertexN;j++){
if(G->Edges[i][j] && !G->Visited[j]){
if(!Find(Q,j))
AddQ(Q,j);
}
}
k = DeleteQ(Q);
G->Visited[k] = 1;
printf("%d ",k);
i = Q[top];
}
return 0;
}
int Find(int* Q,int k){
int i = top + 1;
for(;i<end;i++)
if(Q[i] == k)
return 1;
return 0;
}
int AddQ(int* Q,int k){
if(top == 0 && !Qp){
Q[top] = k;
Qp++;
return 0;
}
else
Q[end++] = k;
return 0;
}
int DeleteQ(int* Q){
int k;
k = Q[top++];
return k;
}
int DFS(Graph* G,int V){
int W;
printf("%d ",V);
G->Visited[V] = 1;
for(W = 0;W<G->VertexN;W++){
if(G->Edges[V][W] && !G->Visited[W])
DFS(G,W);
}
return 0;
}
int ReadG(Graph* G){
int i,V1,V2;
scanf("%d%d",&G->VertexN,&G->EdgeN);
for(i = 0;i<G->EdgeN;i++){
scanf("%d%d",&V1,&V2);
G->Edges[V1][V2] = G->Edges[V2][V1] = 1;
}
return 0;
}
int InitializeG(Graph* G){
int i,j;
for(i = 0;i<10;i++){
for(j = 0;j<10;j++)
G->Edges[i][j] = 0;
G->Visited[i] = 0;
}
G->EdgeN = G->VertexN = 0;
return 0;
}