PTA 06-图1 列出连通集 (25分)

题目地址

https://pta.patest.cn/pta/test/15/exam/4/question/714

 

5-6 列出连通集   (25分)

给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N-1N1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:

输入第1行给出2个整数NN(00<N10)和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
#include
#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

  

转载于:https://www.cnblogs.com/gk2017/p/7140967.html

你可能感兴趣的:(PTA 06-图1 列出连通集 (25分))