zoukankan      html  css  js  c++  java
  • 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<Nle 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
    ");	
    		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
    ");
    		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("}
    ");
    		}
    	}
    	ClearFlags();
    	Q=InitQueue();
    	for(i=0;i<n;i++)
    	{
    		if(gVisitedFlag[i]==0)
    		{
    			printf("{ ");
    			BFS(i,n,Q);
    			printf("}
    ");
    		}
    	}
    }
    

      

  • 相关阅读:
    【装机知识】内存条知识总结
    【装机知识】主板知识整理
    【装机知识】CPU知识整理
    SHELL 学历笔记
    tmux 会话恢复(no sessions)
    数据库客户端神器(mycli/pgcli/iredis)
    golang编写二叉树
    编译安装带lua 的 vim 编辑器
    linux 下vim 开发环境配置(通用所有编程语言)
    mac 下安装mysql
  • 原文地址:https://www.cnblogs.com/gk2017/p/7140967.html
Copyright © 2011-2022 走看看