#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 10
int Visited[MaxVertexNum];
typedef struct MGraph{
int Vertices[MaxVertexNum];
int Edges[MaxVertexNum][MaxVertexNum];
int n, e;
} MGraph;
typedef struct QNode{
int Data[MaxVertexNum];
int rear;
int front;
} QNode, *Queue;
void Reset_tmp(MGraph *G);
void Reset_Visited();
int Check_Visited(MGraph *G);
Queue Create_Queue();
void Add_Queue(Queue Q, int item);
int Delete_Queue(Queue Q);
int IsEmpty_Queue(Queue Q);
void Create_MGraph(MGraph *G);
void DFS(MGraph *G, int i);
void BFS(MGraph *G);
int FirstAdjV(MGraph *G, int V);
int NextAdjV(MGraph *G, int V, int W);
int main(int argc, char const *argv[])
{
// freopen("test.txt", "r", stdin);
for (int i = 0; i < MaxVertexNum; i++)
Visited[i] = 0;
MGraph G;
Create_MGraph(&G);
for (int i = 0; i < G.n; i++){
if (Visited[i] == 0){
printf("{ ");
DFS(&G, i);
printf("}\n");
}
}
Reset_Visited();
BFS(&G);
return 0;
}
Queue Create_Queue()
{
Queue Q = (Queue)malloc(sizeof(QNode));
Q->rear = Q->front = 0;
return Q;
}
void Add_Queue(Queue Q, int item)
{
if((Q->rear+1) % MaxVertexNum == Q->front){
printf("Queue is full\n");
return;
}
Q->rear = (Q->rear+1) % MaxVertexNum;
Q->Data[Q->rear] = item;
}
int Delete_Queue(Queue Q)
{
if(IsEmpty_Queue(Q)){
printf("Queue is empty\n");
return -1;
}
Q->front = (Q->front+1) % MaxVertexNum;
return Q->Data[Q->front];
}
int IsEmpty_Queue(Queue Q)
{
if(Q->rear == Q->front)
return 1;
else
return 0;
}
int Check_Visited(MGraph *G)
{
for (int i = 0; i < G->n; i++){
if (!Visited[i])
return 1;
}
return 0;
}
void Reset_Visited()
{
for (int i = 0; i < MaxVertexNum; i++)
Visited[i] = 0;
}
void Create_MGraph(MGraph *G)
{
scanf("%d %d", &(G->n), &(G->e));
for (int i = 0; i < G->n; i++){
for (int j = 0; j < G->n; j++)
G->Edges[i][j] = 0;
}
int i, j;
for (int k = 0; k < G->e; k++){
scanf("%d %d", &i, &j);
G->Edges[i][j] = 1;
G->Edges[j][i] = 1;
}
}
void DFS(MGraph *G, int i)
{
Visited[i] = 1;
printf("%d ", i);
for (int j = 0; j < G->n; j++){
if(G->Edges[i][j] == 1 && Visited[j] == 0)
DFS(G, j);
}
}
void BFS(MGraph *G)
{
int V, W;
Queue Q = Create_Queue();
for (int i = 0; i < G->n; i++){
if (Visited[i] == 0){
printf("{ ");
Visited[i] = 1;
printf("%d ", i);
Add_Queue(Q, i);
while(!IsEmpty_Queue(Q)){
V = Delete_Queue(Q);
for(W = FirstAdjV(G, V); W < G->n; W = NextAdjV(G, V, W)){
if(!Visited[W]){
Visited[W] = 1;
printf("%d ", W);
Add_Queue(Q, W);
}
else
break;
}
}
printf("}");
if (Check_Visited(G))
printf("\n");
}
}
}
int FirstAdjV(MGraph *G, int V)
{
for (int i = 0; i < G->n; i++){
if (G->Edges[V][i] == 1 && Visited[i] == 0)
return i;
}
}
int NextAdjV(MGraph *G, int V, int W)//不考虑W反而过了
{
for (int i = 0; i < G->n; i++){
if (G->Edges[V][i] == 1 && Visited[i] == 0)
return i;
}
}