ToB企服应用市场:ToB评测及商务社交产业平台

标题: 数据结构 图及其应用 [打印本页]

作者: 光之使者    时间: 2024-2-23 07:14
标题: 数据结构 图及其应用
一、要求
  1.设计并验证如下算法:图采用邻接矩阵表示,实现无向图的深度优先搜索与有向图的广度优先搜索。
  2.设计并验证如下算法:带权图采用邻接表表示,实现无向图的广度优先搜索与有向图的深度优先搜索。
二、代码
1.
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #define INFINITY INT_MAX
  5. #define MAX_VERTEX_NUM 20
  6. typedef struct queue
  7. {
  8.     int Data[MAX_VERTEX_NUM];
  9.     int front;
  10.     int rear;
  11. }SqQueue;
  12. int visited[MAX_VERTEX_NUM];//1--已访问   0--未访问
  13. typedef struct mgraph
  14. {
  15.     char vexs[MAX_VERTEX_NUM];//顶点向量
  16.     int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
  17.     int vexnum;//图的顶点数
  18. }Mgraph;
  19. void init_queue(SqQueue *);
  20. void EnQueue(SqQueue *,int);
  21. void DeQueue(SqQueue *);
  22. int empty_queue(SqQueue *);
  23. void DFS(Mgraph G,int v);
  24. void DFSTraverse(Mgraph G);
  25. void BFSTraverse(Mgraph G);
  26. int main()
  27. {
  28.     Mgraph G;
  29.     printf("请输入图的顶点数\n");
  30.     scanf("%d",&G.vexnum);
  31.     printf("输入图的各个顶点向量\n");
  32.     scanf("%s",&G.vexs);
  33.     srand((unsigned)time(NULL));
  34.     for(int i=0;i<G.vexnum;i++)//随机生成邻接矩阵
  35.     {
  36.         for(int j=0;j<G.vexnum;j++)
  37.             G.arcs[i][j]=rand()%2;
  38.     }
  39.     printf("该图的邻接矩阵如下:\n");
  40.     for(int i=0;i<G.vexnum;i++)//随机生成邻接矩阵
  41.     {
  42.         for(int j=0;j<G.vexnum;j++)
  43.             printf("%d ",G.arcs[i][j]);
  44.         printf("\n");
  45.     }
  46.     printf("深度优先遍历结果如下:\n");
  47.     DFSTraverse(G);
  48.     printf("\n");
  49.     printf("广度优先遍历结果如下:\n");
  50.     BFSTraverse(G);
  51.     return 0;
  52. }
  53. void DFSTraverse(Mgraph G)
  54. {
  55.     for(int v=0;v<G.vexnum;v++)//标记赋值为未访问
  56.         visited[v]=0;
  57.     for(int v=0;v<G.vexnum;v++)//调用DFS
  58.         if(!visited[v])
  59.            DFS(G,v);
  60. }
  61. void DFS(Mgraph G,int v)
  62. {
  63.     visited[v]=1;
  64.     printf("%c ",G.vexs[v]);
  65.     for(int n=0;n<G.vexnum;n++)
  66.     {
  67.         if((visited[n]==0)&&(G.arcs[v][n]==1))
  68.             DFS(G,n);
  69.     }
  70. }
  71. void BFSTraverse(Mgraph G)//广度优先遍历
  72. {
  73.     SqQueue Q;
  74.     for(int i=0;i<G.vexnum;i++)
  75.         visited[i]=0;
  76.     init_queue(&Q);
  77.     for(int i=0;i<G.vexnum;i++)
  78.     {
  79.         if(!visited[i])
  80.         {
  81.             visited[i]=1;
  82.             printf("%c ",G.vexs[i]);
  83.             EnQueue(&Q,i);
  84.         }
  85.         while(!empty_queue(&Q))
  86.         {
  87.             DeQueue(&Q);
  88.             for(int j=0;j<G.vexnum;j++)
  89.             {
  90.                 if(!visited[j]&&G.arcs[i][j])
  91.                 {
  92.                     visited[j]=1;
  93.                     printf("%c ",G.vexs[j]);
  94.                     EnQueue(&Q,j);
  95.                 }
  96.             }
  97.          }
  98.     }
  99. }
  100. void init_queue(SqQueue *Q)
  101. {
  102.     Q->front=Q->rear=0;
  103. }
  104. void EnQueue(SqQueue *Q,int e)
  105. {
  106.         Q->Data[Q->rear]=e;
  107.         Q->rear++;
  108. }
  109. void DeQueue(SqQueue *Q)
  110. {
  111.     Q->front++;
  112. }
  113. int empty_queue(SqQueue *Q)
  114. {
  115.     if(Q->front==Q->rear)
  116.         return 1;
  117.     else
  118.         return 0;
  119. }
复制代码
 
运行结果:
 
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4