• PTA数据结构与算法题目集(中文) 7-6


    PTA数据结构与算法题目集(中文)  7-6

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

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

    输入格式:

    输入第1行给出2个整数N(0)和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 #define _CRT_SECURE_NO_WARNINGS   
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 #include<malloc.h>
      5 #define MaxVertexNum 100
      6 
      7 typedef struct ENode* Edge;
      8 struct ENode
      9 {
     10     int V1, V2;
     11 };
     12 typedef struct GNode* Graph;
     13 struct GNode
     14 {
     15     int Nv;
     16     int Ne;
     17     int G[MaxVertexNum][MaxVertexNum];
     18 };
     19 
     20 Graph BuildGraph(int VertexNum)
     21 {
     22     Graph Gra;
     23     Gra = (Graph)malloc(sizeof(struct GNode));
     24     Gra->Ne = 0;
     25     Gra->Nv = VertexNum;
     26     for (int i = 0; i < VertexNum; i++)
     27         for (int j = 0; j < VertexNum; j++)
     28             Gra->G[i][j] = 0;
     29     return Gra;
     30 }
     31 void InsertEdge(Edge E, Graph Gra)
     32 {
     33     Gra->G[E->V1][E->V2] = 1;
     34     Gra->G[E->V2][E->V1] = 1;
     35 }
     36 Graph CreatGraph()
     37 {
     38     Edge E;
     39     int N, M;
     40     scanf("%d%d", &N, &M);
     41     Graph G = BuildGraph(N);
     42     G->Ne = M;
     43     for (int i = 0; i < M; i++)
     44     {
     45         E = (Edge)malloc(sizeof(struct ENode));
     46         int V1, V2;
     47         scanf("%d%d", &V1, &V2);
     48         E->V1 = V1;
     49         E->V2 = V2;
     50         InsertEdge(E, G);
     51     }
     52     return G;
     53 }
     54 int IsEdge(Graph G, int V1, int V2)
     55 {
     56     return G->G[V1][V2] == 1;
     57 }
     58 int Collected[MaxVertexNum];
     59 void Initialize()
     60 {
     61     for (int i = 0; i < MaxVertexNum; i++)
     62         Collected[i] = 0;
     63 }
     64 void DFS(Graph G,int i)
     65 {
     66     printf("%d ", i);
     67     Collected[i] = 1;
     68     for (int j = 0; j < G->Nv; j++)
     69     {
     70         if (!Collected[j]&&IsEdge(G,i,j))
     71             DFS(G, j);
     72     }
     73 }
     74 
     75 int Queue[10];
     76 int Front = 1;
     77 int Rear = 0;
     78 int Size = 0;
     79 int Succ(int num)
     80 {
     81     if (num == 10)
     82         return 0;
     83     else
     84         return num;
     85 }
     86 void EnQueue(int num)
     87 {
     88     Rear = Succ(Rear + 1);
     89     Queue[Rear] = num;
     90     Size++;
     91 }
     92 int DeQueue()
     93 {
     94     int Value = Queue[Front];
     95     Front = Succ(Front + 1);
     96     Size--;
     97     return Value;
     98 }
     99 int IsEmpty()
    100 {
    101     return Size == 0;
    102 }
    103 void BFS(Graph G,int i)
    104 {
    105     EnQueue(i);
    106     Collected[i] = 1;
    107     while (!IsEmpty())
    108     {
    109         int Tmp = DeQueue();
    110         printf("%d ", Tmp);
    111         for (int j = 0; j < G->Nv; j++)
    112         {
    113             if (!Collected[j] && IsEdge(G, Tmp, j))
    114             {
    115                 EnQueue(j);
    116                 Collected[j] = 1;
    117             }
    118         }
    119     }
    120 }
    121 int main()
    122 {
    123     Graph G=CreatGraph();
    124     for (int i = 0; i < G->Nv; i++)
    125     {
    126         if (!Collected[i])
    127         {
    128             printf("{ ");
    129             DFS(G, i);    
    130             printf("}");
    131             printf("
    ");
    132         }
    133     }
    134     Initialize();
    135     for (int i = 0; i < G->Nv; i++)
    136     {
    137         if (!Collected[i])
    138         {
    139             printf("{ ");
    140             BFS(G, i);
    141             printf("}");
    142             printf("
    ");
    143         }
    144     }
    145     return 0;
    146 }
    View Code
  • 相关阅读:
    【Rust】二叉搜索树删除
    【Rust】二叉搜索树插入迭代
    【Rust】二叉树后续迭代
    【Rust】二叉树中序迭代
    【Rust】二叉搜索树检索迭代
    【Rust】二叉搜索树检索
    【Rust】二叉搜索树获取极值
    QTP11&11.5破解方法
    1
    操作系统:文件系统 文件系统的格式化操作
  • 原文地址:https://www.cnblogs.com/57one/p/11584957.html
Copyright © 2020-2023  润新知