• 7-6 列出连通集(25 分)(广度优先遍历和深度优先遍历)


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

    输入格式:

    输入第1行给出2个整数N(0<N10)和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 }

    解题思路:1.数据量不大使用邻接矩阵来表示图,个人感觉用矩阵比较简单一些
    2.然后就是邻接矩阵的深度遍历跟广度遍历,这里注意下大括号{}的输出即可
      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 
      4 #define MAXVEX 15
      5 
      6 void CreateGraph( );
      7 void DFS( int i);
      8 void DFSTraverse();
      9 void BFSTraverse();
     10 
     11 int G[MAXVEX][MAXVEX],Nv,Ne;
     12 int visited[MAXVEX];
     13 
     14 int main()
     15 {
     16     CreateGraph();
     17     DFSTraverse();
     18     BFSTraverse();
     19     return 0;
     20 }
     21 
     22 void CreateGraph()
     23 {
     24     //用邻接矩阵表示图
     25     int i,j;
     26     int v1,v2;
     27     scanf("%d %d",&Nv,&Ne);
     28     for( i=0; i<Nv; i++)
     29     {
     30         for( j=0; j<Nv; j++)
     31         {
     32             G[i][j] = 0;  //初始化
     33         }
     34     }
     35     for( i=0; i<Ne; i++)  //注意这里是读入边
     36     {
     37         scanf("%d %d",&v1,&v2);
     38         G[v1][v2] = 1;
     39         G[v2][v1]= G[v1][v2];  //无向图对称
     40     }
     41 }
     42 
     43 void DFS( int i)
     44 {
     45     int j;
     46 
     47     visited[i] = 1;
     48     printf("%d ",i);
     49     for( j=0; j<Nv; j++)
     50     {
     51         if( G[i][j] && !visited[j])
     52         {
     53             //如果存在ij之间的连线且j并未被访问过
     54             DFS (j);
     55         }
     56     }
     57 }
     58 void DFSTraverse( )
     59 {
     60     int i;
     61 
     62     for( i=0; i<Nv; i++)
     63     {
     64         visited[i] = 0;  //初始化访问矩阵
     65     }
     66     for ( i=0; i<Nv; i++)
     67     {
     68         if( !visited[i])
     69         {
     70             printf("{ ");
     71             DFS(i);
     72             printf("}
    ");
     73         }
     74     }
     75 }
     76 
     77 void BFSTraverse( )
     78 {
     79     int q[MAXVEX]={0};  //用数组表示队列
     80     int rear=-1,front=-1;
     81     int i,j;
     82     int temp;
     83 
     84     for( i=0; i<Nv; i++)
     85     {
     86         visited[i] = 0;
     87     }
     88 
     89     for( i=0; i<Nv; i++){
     90         if( !visited[i]){
     91             printf("{ ");
     92             visited[i] =1;
     93             q[++rear] = i;  //入队
     94             while( front<rear ){   //判断队列是否为空
     95                 temp =q[++front];  //出队
     96                 printf("%d ",temp);
     97                 for( j=0; j<Nv;j++){
     98                     if( G[temp][j] && !visited[j]){
     99                         visited[j] = 1;
    100                         q[++rear] = j;
    101                     }
    102                 }
    103             }
    104             printf("}
    ");
    105         }
    106     }
    107 
    108 }





    在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!
  • 相关阅读:
    测试代码运行效率
    用宏实现的单例模式
    上传控件的按钮改为图片
    ODAC的使用笔记
    ASP.NET防止重复提交
    向SharePoint图片库添加Item
    获取页面上用户控件的子控件ID
    SharePoint的WebService的应用
    GridView中HyperLinkField的链接使用JavaScript问题
    C#日期验证的正则表达式
  • 原文地址:https://www.cnblogs.com/yuxiaoba/p/8335758.html
Copyright © 2020-2023  润新知