给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照"{ v1 v2 ... vk }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。
输入样例:
8 6
0 7
0 1
2 0
4 1
2 4
3 5
输出样例:
{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }
刚学的图,之前只学了DFS一种遍历方法 今天碰上这道题 顺手把BFS也写了一遍。
#include<stdio.h>
#include<stdlib.h>
#define MAX 110
int N;
int E;
int a[10][10];//邻接矩阵
int visit[MAX];//访问数组
typedef struct node{
int date[MAX];
int tail;
int head;
}Quque; //队列结构
void add(int x,Quque *Q);//入队
int isEmpty(Quque *Q);//是否非空
int delet(Quque *Q);//出队
void dfs(int i);//深度优先搜索遍历
void bfs(int i,Quque *Q);//广度优先搜索遍历
int main()
{
int i,x1,x2;
scanf("%d%d",&N,&E);
for(i=0;i<E;i++)
{
scanf("%d%d",&x1,&x2);
a[x1][x2]=a[x2][x1]=1;
}
for(i=0;i<N;i++)
{
if(visit[i]==0)
{
printf("{ ");
dfs(i);
printf("}");
printf("\n");
}
}
for(i=0;i<110;i++) //dfs过后初始化visit
visit[i]=0;
Quque *Q=(Quque*)malloc(sizeof(Quque));//建立空队列 初始化
Q->head=Q->tail=0;
for(i=0;i<N;i++)
{
if(visit[i]==0)
{
printf("{ ");
bfs(i,Q);
printf("}");
printf("\n");
}
}
return 0;
}
void dfs(int i)
{
if(visit[i]==0)
{
visit[i]=1;
printf("%d ",i);
}
int j;
for(j=0;j<N;j++)
{
if(visit[j]==0&&a[i][j]==1)//如果没访问过而且有边
dfs(j);
}
}
void add(int x,Quque *Q)
{
Q->date[Q->tail++]=x;
}
int isEmpty(Quque *Q)
{
if(Q->head>=Q->tail)
return 1;
else
return 0;
}
int delet(Quque *Q)
{
int x=Q->date[Q->head];
Q->head++;
return x;
}
void bfs(int i,Quque *Q)
{
add(i,Q);//入队
visit[i]=1; //标记
while(!isEmpty(Q)) //当队列非空时 接着BFS
{
int j,t=delet(Q);//令t=出队
printf("%d ",t);
for(j=0;j<N;j++)
{
if(a[t][j]==1&&visit[j]==0)//如果出队的顶点t还有其他边 并且没访问过
{
visit[j]=1;//入队
add(j,Q);//标记
}
}
}
}
今天连着AC了三道 感觉这段时间以来的学习有了收获。美滋滋。