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(0<N\le 100<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<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");
		}
	}
}

  

posted on 2017-07-09 11:31  gravitykey  阅读(931)  评论(0编辑  收藏  举报

导航