数据结构(六)——图之最短路径

本文介绍了数据结构中图的最短路径问题,讲解了Dijkstra算法和Floyd算法的实现原理。Dijkstra算法通过标记已搜索点并不断更新最短路径,而Floyd算法采用三层循环进行路径探索。文中提供了源代码和测试样例,展示了算法的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码中所用到的结构体

typedef struct arccell
{
   
   
    int adj;//权值
    char *info;
}ArcCell,AdjMatrix[MAX][MAX];

typedef struct
{
   
   
    int vexs[MAX];//结点数据
    AdjMatrix arcs;
    int vexnum,arcnum;//图的点数和边数
    GraphKind kind;//图的种类
}MGraph,*pMGraph;

构造无向图

  • 这里,无向图用的是矩阵存储
  • 并且在初始化的时候已经将矩阵每个点的数据自动赋值,并在整个邻接矩阵中,每个点的数据赋值为无穷大,代码中是以INF 999999来表示无穷大。
int Locatevex(pMGraph G,int v)//定位元素在一维数组的位置
{
   
   
    int i;
    for(i=0;i<G->vexnum;i++)//寻找位于一维数组的哪个位置
    {
   
   
        if(G->vexs[i]==v)
        {
   
   
            return i;//返回该位置
        }
    }
    if(i==G->vexnum)
    {
   
   
        return -1;//不存在该数据
    }
}

int CreateUDN(pMGraph G)//构造无向网
{
   
   
    int i,j,k;
    int v1,v2,loc;
    int n,m,w;
    printf("Please input the vex number    arc number    start location:\n");
    scanf("%d%d%d",&(G->vexnum),&(G->arcnum),&loc);//输入图的顶点数和弧度
    for(i=0;i<G->vexnum;i++)
    {
   
   
          G->vexs[i]=i+1;//将图赋初值
    }
    for(i=0;i<(G->vexnum);i++)//清空二维数组
    {
   
   
        for(j=0;j<(G->vexnum);j++)
        {
   
   
            G->arcs[i][j].adj=INF;
            G->arcs[i][j].info=NULL;
        }
    }
    for(k=0;k<G->vexnum;k++)
        G->arcs[k][k].adj=0;//将图对角初始化
    for(i=0;i<G->arcnum;i++)//输入数据
    {
   
   
        printf("Please input the v1 v2 w.\n");
        scanf("%d%d%d",&v1,&v2,&w);//输入弧头、弧尾和权重
        getchar();
        n=Locatevex(G,v1);//定位
        m=Locatevex(G,v2);//定位
        if(m==-1||n==-1)
        {
   
   
            printf("no this vertex");
            return;
        }
        else
        {
   
   
            G->arcs[n][m].adj=w;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值