图——邻接矩阵

题目:采用邻接矩阵存储结构,编写拓扑排序算法输出拓扑序列。

算法逻辑:

①首先,定义一个邻接矩阵存储结构的图g;定义createAdjMatrixGraph函数用于创建邻接矩阵;定义一个LocateVertex函数,用于返回顶点v在图g中的位置;调用这两个函数创建邻接矩阵;

②使用循环输出邻接矩阵;

③定义一个队列Q,用于输出拓扑排序;

④定义一个createAOVsorted函数用于进行拓扑排序;调用该函数进行拓扑排序,并输出;

源代码:

#include<stdio.h>
#define MAX_VERTEX_NUM 10 /*最多顶点个数*/
#define INFINITY 32767 /*无穷大*/
typedef int ElemType;
#include"sqQueue.h" /*使用队列输出拓扑排序*/
typedef char VertexData; /*假设顶点数据为字符型*/
typedef int ArcNode;
typedef struct{
  VertexData vexs[MAX_VERTEX_NUM]; /*顶点向量*/
  ArcNode arcs [MAX_VERTEX_NUM][MAX_VERTEX_NUM]; /*邻接矩阵*/
  int vexnum, arcnum; /*图的顶点数和弧数*/
  int rudushu[MAX_VERTEX_NUM]; /*顶点的入度数*/
} AdjMatrix; /*(Adjacency Matrix Graph)*/

//若顶点v在图G中存在,则返回顶点v在图G中的位置。
//若图G中没有顶点v,则函数返回值为“空”。
int LocateVertex(AdjMatrix *g,VertexData v)
{
  int i;
  for(i=0;i<g->vexnum;i++){
    if(g->vexs[i]==v){
      return i;
    }
  }
  return -1;
}
//返回图G中的第i个顶点的值。
VertexData GetVertex(AdjMatrix *g,int i)
{
  return g->vexs[i];
}
//创建邻接矩阵
void createAdjMatrixGraph(AdjMatrix *g){
  int n;
  int i,j;
  char v,w;
  int vi,vw;
  printf("请输入图的顶点个数:");
  scanf("%d",&n);
  g->vexnum=n;
  for(i=1;i<=n;i++){
    printf("请输入第%d个顶点的信息:",i);
    scanf(" %c",&v);
    g->vexs[i-1] = v;
    for (j=0;j<n;j++){
      g->arcs[i-1][j]=0;
    }
    g->rudushu[i-1]=0;
  }
  printf("请输入图的边数:");
  scanf("%d",&n);
  g->arcnum=n;
  for(i=1;i<=n;i++){
    printf("请输入第%d条边的信息:",i);
    scanf(" %c,%c",&v,&w);
    vi=LocateVertex(g,v);
    vw=LocateVertex(g,w);
    if(vi==-1 || vw==-1){
    continue;
    }
    g->arcs[vi][vw]=1;
  }
}
//进行拓扑排序
void createAOVsorted(AdjMatrix *g,Queue *Q){
  int i,j,k;
  for (i=0;i<g->vexnum;i++){ //计算每个顶点的入度数
    for (j=0;j<g->vexnum;j++){
      if (g->arcs[j][i]!=0){
        g->rudushu[i]++;
      }
    }
  }
  printf("\n");
  for (i=0;i<g->vexnum;i++){ //输出每个顶点的入度数
    printf("%c顶点的入度数为:%d\n",g->vexs[i],g->rudushu[i]);
  }
  printf("\n");
  //遍历图的每个顶点,若有入度数为0的顶点,将其入队
  for (i=0;i<g->vexnum;i++){
    if (g->rudushu[i]==0){
      EnQueue(Q,i);
    }
  }
  ElemType e; //e用来接受出队的数据
  printf("拓扑排序为:\n");
  while ( !(QueueEmpty(Q)) ){ //队列不为空就循环
    DeQueue(Q,&e); //从队列中取出第一个顶点,出队
    printf("%d-",e); //并将其输出
    for (k=0;k<g->vexnum;k++){ //设置循环,找出该顶点的所有邻接点
      if (g->arcs[e][k]!=0){ //若是邻接点
        g->rudushu[k]--; //该邻接点入减一
        g->arcs[e][k]=0;
        //若减后的该邻接点入度为0,则将其入队
        if (g->rudushu[k]==0){
          EnQueue(Q,k);
        }
      }
    }
  }
}

int main()
{
  AdjMatrix g; //定义一个邻接矩阵存储结构的图g
  int i,j;
  int v,w;
  createAdjMatrixGraph(&g); //创建邻接矩阵
  printf("\n");
  for(i=0;i<g.vexnum;i++){ //输出邻接矩阵
    for(j=0;j<g.vexnum;j++){
      printf("%2d",g.arcs[i][j]);
    }
    printf("\n");
  }
  Queue Q; //使用队列输出拓扑排序
  InitQueue(&Q); //初始化队列
  createAOVsorted(&g,&Q); //进行拓扑排序

  return 0;
}  

posted @   ulyee  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示