迪杰斯特拉 C语言实现

 #include <stdio.h>
#define INFINITY 255
#define TRUE 1
#define FALSE 0
#define MAX 6
typedef struct MGraph
{
    char vexs[MAX]; 
    int arcs[MAX][MAX]; 
    int vexnum;    
    int arcnum;   
}MGraph;
void ShortestPath(MGraph g,int v0,int p[][MAX],int D[])
{
    int v;
    int w;
    int min;
    int i,j;
    int final[MAX]; 
    for (v = 0; v < g.vexnum; v++)
    {
        final[v] = FALSE;
        D[v] = g.arcs[v0][v];
        for (w = 0; w < g.vexnum; w++)
        {
            p[v][w] = -1;
        }
        if (D[v] < INFINITY)
        {
            p[v][v0] = v;
        }
    }
    D[v0] = 0;
    final[v0] = TRUE;
    for (i = 1; i < g.vexnum; i++)      
    {
        min=INFINITY;
        for (w = 0; w<g.vexnum; w++)
        {
            if (!final[w]) 
            {
                if (D[w] < min)
                {
                    v=w;
                    min=D[w];
                }
            }
        }
        final[v] = TRUE;  
        for (w = 0; w<g.vexnum; w++)   
        {
            if (!final[w] && (min+g.arcs[v][w] < D[w]) )
            {   
          
                D[w] = min + g.arcs[v][w];
                for (j = 0; j <MAX; j++)
                {
                    p[w][j] = p[v][j];
                }
                p[w][v] = w; 
            }
        }
    }
}


void main()
{
    int i,j;
    MGraph g;
    int p[MAX][MAX];
    int d[MAX];
    int v0;
    g.vexs[0]='A',g.vexs[1]='B',g.vexs[2]='C',g.vexs[3]='D',g.vexs[4]='E',g.vexs[5]='F';
 printf("输入带权邻接矩阵:/n");
    for(i=0;i<MAX;i++)
        for(j=0;j<MAX;j++)       
            g.arcs[i][j]=INFINITY;
    g.arcs[0][2]=10,g.arcs[0][4]=30,g.arcs[0][5]=100,g.arcs[1][2]=5,
        g.arcs[2][3]=50,g.arcs[3][5]=10,g.arcs[4][3]=20,g.arcs[4][5]=60;
    g.vexnum=g.arcnum=MAX;
    for(i=0;i<MAX;i++)
    {
        printf("%c/t",g.vexs[i]);
        for(j=0;j<MAX;j++)
        {
            printf("%5d ",g.arcs[i][j]);
        }
        printf("/n");
    }
    printf("/n");
    v0 = 0;
    ShortestPath(g,v0,p,d);
    for (i = 0; i < g.vexnum; i++)
    {
        printf("节点 %c 到 %c 的路径:/n",g.vexs[v0],g.vexs[i]);
        if ( p[i][v0] != -1 )  
        {
            for (j = v0; j != -1; j = p[i][j])
            {
                if (j != v0)
                    printf("→");
                printf("%c",g.vexs[j]);
            }
            printf("/n");
        }
        printf("长度:%d/n",d[i]);
        printf("/n");
    }
}

 

 

这是一个固定带权数的图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值