• 06-图1 列出连通集(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 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <unistd.h>
      4 
      5 #define MaxVertexNum 100
      6 #define INFINITY     65535
      7 #define MaxSize 100
      8 
      9 typedef int Vertex;
     10 typedef int WeightType;
     11 typedef char DataType;
     12 
     13 typedef struct ENode *PtrToENode;
     14 struct ENode {
     15     Vertex V1, V2;
     16     WeightType Weight;
     17 };
     18 typedef PtrToENode Edge;
     19 
     20 typedef struct GNode *PtrToGNode;
     21 struct GNode {
     22     int Nv;
     23     int Ne;
     24     WeightType G[MaxVertexNum][MaxVertexNum];
     25     DataType Data[MaxVertexNum];
     26 };
     27 typedef PtrToGNode MGraph;
     28 
     29 struct QNode {
     30     Vertex Data[MaxSize];
     31     int rear;
     32     int front;
     33 };
     34 typedef struct QNode *Queue;
     35 
     36 MGraph CreateGraph(int VertexNum)
     37 {
     38     Vertex V, W;
     39     MGraph Graph;
     40 
     41     Graph = (MGraph)malloc(sizeof(struct GNode));
     42     Graph->Nv = VertexNum;
     43     Graph->Ne = 0;
     44     for(V=0;V<Graph->Nv;V++)
     45         for(W=0;W<Graph->Nv;W++)
     46             Graph->G[V][W] = INFINITY;
     47 
     48     return Graph;
     49 }
     50 
     51 void InsertEdge(MGraph Graph, Edge E)
     52 {
     53     Graph->G[E->V1][E->V2] = E->Weight;
     54     Graph->G[E->V2][E->V1] = E->Weight;
     55 }
     56 
     57 MGraph BuildGraph()
     58 {
     59     MGraph Graph;
     60     Edge E;
     61     // Vertex V;
     62     int Nv, i;
     63 
     64     scanf("%d ", &Nv);
     65     Graph = CreateGraph(Nv);
     66 
     67     scanf("%d
    ", &(Graph->Ne));
     68     if(Graph->Ne != 0) {
     69         E = (Edge)malloc(sizeof(struct ENode));
     70         for(i=0;i<Graph->Ne;i++) {
     71             scanf("%d %d
    ", &E->V1, &E->V2);
     72             E->Weight = 1;
     73             InsertEdge(Graph, E);
     74         }
     75     }
     76 
     77     // for(V=0;V<Graph->Nv;V++)
     78     //     scanf(" %c", &(Graph->Data[V]));
     79 
     80     return Graph;
     81 }
     82 
     83 //DFS
     84 void Visit(Vertex V)
     85 {
     86     // printf("Now visit Vertex %d
    ", V);
     87     printf(" %d", V);
     88 }
     89 
     90 void DFS(MGraph Graph, Vertex V, int *Visited)
     91 {
     92     Vertex W;
     93 
     94     Visit(V);
     95     Visited[V] = 1;         //已访问
     96 
     97     for(W=0;W<Graph->Nv;W++)
     98         if(Graph->G[V][W]==1 && Visited[W]==0)
     99             DFS(Graph, W, Visited);
    100 }
    101 
    102 //BFS
    103 int IsEmpty(Queue Q)
    104 {
    105     return (Q->rear == Q->front);   //1:empty 0:not empty
    106 }
    107 
    108 void AddQ(Queue PtrQ, Vertex item)
    109 {
    110     if((PtrQ->rear+1)%MaxSize == PtrQ->front) {
    111         printf("Queue full");
    112         return;
    113     }
    114     PtrQ->rear = (PtrQ->rear+1)%MaxSize;
    115     PtrQ->Data[PtrQ->rear] = item;
    116 }
    117 
    118 Vertex DeleteQ(Queue PtrQ)
    119 {
    120     if(PtrQ->front == PtrQ->rear) {
    121         printf("Queue empty");
    122         return -1;
    123     } else {
    124         PtrQ->front = (PtrQ->front+1)%MaxSize;
    125         return PtrQ->Data[PtrQ->front];
    126     } 
    127 }
    128 
    129 int IsEdge(MGraph Graph, Vertex V, Vertex W)
    130 {
    131     return Graph->G[V][W]<INFINITY?1:0;
    132 }
    133 
    134 void BFS(MGraph Graph, Vertex S, int *Visited)
    135 {
    136     Queue Q;
    137     Vertex V, W;
    138     Q = (Queue)malloc(sizeof(struct QNode));
    139     Visit(S);
    140     Visited[S] = 1;
    141     AddQ(Q, S);
    142 
    143     while(!IsEmpty(Q)) {
    144         V = DeleteQ(Q);
    145         for(W=0;W<Graph->Nv;W++)
    146             if(!Visited[W] && IsEdge(Graph, V, W)) {
    147                 Visit(W);
    148                 Visited[W] = 1;
    149                 AddQ(Q, W);
    150             }
    151     }
    152 }
    153 
    154 void PrintGraph(MGraph Graph)
    155 {
    156     Vertex V, W;
    157     printf("Graph:
    ");
    158     for(V=0;V<Graph->Nv;V++) {
    159         for(W=0;W<Graph->Nv;W++) 
    160             printf("%5d " ,Graph->G[V][W]);
    161         printf("
    ");
    162     }
    163     printf("-----------------------
    ");
    164 }
    165 
    166 int main()
    167 {
    168     MGraph Graph;
    169     int *Visited, i;
    170 
    171     Graph = BuildGraph();
    172     Visited = (int *)malloc(sizeof(int)*(Graph->Nv));
    173     for(i=0;i<Graph->Nv;i++)
    174         Visited[i] = 0;
    175     // PrintGraph(Graph);
    176 
    177     //DFS
    178     for(i=0;i<Graph->Nv;i++) {
    179         if(Visited[i] == 0) {
    180             printf("{");
    181             DFS(Graph, i, Visited);
    182             printf(" }
    ");
    183         }
    184     }
    185 
    186     //BFS
    187     for(i=0;i<Graph->Nv;i++)
    188         Visited[i] = 0;
    189     for(i=0;i<Graph->Nv;i++) {
    190         if(!Visited[i]) {
    191             printf("{");
    192             BFS(Graph, i, Visited);
    193             printf(" }
    ");
    194         }
    195     }
    196 
    197     return 0;
    198 }
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    笔试题 易错题目解析
    SqlServer 函数 大全
    视频上传到自己的服务器打不开
    sql 计算生日提请日期
    Web API 异常处理(转)
    微软源代码管理工具TFS2013安装与使用详细图文教程(Vs2013)
    关于枚举的用法和类型转换
    html title换行方法 如a链接标签内title属性鼠标悬停提示内容换行
    JS的parent、opener、self对象
    uploadfiy
  • 原文地址:https://www.cnblogs.com/ch122633/p/8967322.html
Copyright © 2020-2023  润新知