题目地址
https://pta.patest.cn/pta/test/15/exam/4/question/714
5-6 列出连通集 (25分)
给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N-1N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数NN(0<N\le 100<N≤10)和EE,分别是图的顶点数和边数。随后EE行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照"{ v_1v1 v_2v2 ... v_kvk }"的格式,每行输出一个连通集。先输出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就可以了。
但是写完发现自己用递归做BFS太坑了,应该提前把点压进去,然后循环就好了。。
/*
评测结果
时间 结果 得分 题目 编译器 用时(ms) 内存(MB) 用户
2017-07-01 18:53 答案正确 25 5-6 gcc 7 1
测试点结果
测试点 结果 得分/满分 用时(ms) 内存(MB)
测试点1 答案正确 15/15 7 1
测试点2 答案正确 8/8 2 1
测试点3 答案正确 2/2 2 1
*/
#include<stdio.h>
#include<stdlib.h>
#define MAXN 20
#define DBG printf
int gMatrix[MAXN][MAXN];
int gVisitedFlag[MAXN];
struct queue{ //BFS需要用到队列,先定义结构
int data[MAXN];
int head;
int tail;
};
typedef struct queue* ptrQ;
ptrQ InitQueue() //malloc一个队列
{
ptrQ Q;
Q=malloc(sizeof(struct queue));
Q->head=0;
Q->tail=0;
return Q;
}
void InsertIntoQueue(int x,ptrQ Q)
{
if ((Q->tail+1 )% MAXN == Q->head)
{
printf("ERROR:Queue Full\n");
return;
}
Q->tail=(Q->tail+1) %MAXN;
Q->data[Q->tail]= x;
}
int DeQueue(ptrQ Q) //出队,队列空了返回个-1
{
if(Q->head==Q->tail)
{
//printf("ERROR:Try to Dequeue form a empty queue\n");
return -1 ;
}
Q->head=(Q->head+1) %MAXN;
return Q->data[Q->head];
}
void ClearFlags() //清空访问标志数组
{
int i;
for(i=0;i<MAXN;i++)
{
gVisitedFlag[i]=0;
}
}
int GetInput() //读数构建邻接矩阵
{
int i,N,E,a,b;
scanf("%d %d",&N,&E);
for(i=0;i<E;i++)
{
scanf("%d %d",&a,&b);
gMatrix[a][b]=1;
gMatrix[b][a]=1;
}
return N;
}
void DFS(int x,int N)
{
int i;
gVisitedFlag[x]=1;
printf("%d ",x);
for(i=0;i<N;i++)
if(gMatrix[x][i]==1 && gVisitedFlag[i]!=1)
{
DFS(i,N);
}
}
void BFS(int x,int N,ptrQ Q)
{
int i,temp;
gVisitedFlag[x]=1;
printf("%d ",x);
for(i=0;i<N;i++)
{
if(gMatrix[x][i]==1 && gVisitedFlag[i] !=1)
{
gVisitedFlag[i]=1;
InsertIntoQueue(i,Q);
}
}
while((temp=DeQueue(Q)) != -1)
{
BFS(temp,N,Q);
}
}
main()
{
ptrQ Q;
int i;
int n=GetInput();
for(i=0;i<n;i++)
{
if(gVisitedFlag[i]==0)
{
printf("{ ");
DFS(i,n);
printf("}\n");
}
}
ClearFlags();
Q=InitQueue();
for(i=0;i<n;i++)
{
if(gVisitedFlag[i]==0)
{
printf("{ ");
BFS(i,n,Q);
printf("}\n");
}
}
}