dij算法(迪杰斯特拉)

跟prim算法很相似,先读到矩阵中去。

然后按点的链接顺序进行遍历(不带所求点玩),求出到各个点的最短距离……

***************************************************************************************************************

#include<stdio.h>
#include<stdbool.h>
#include<memory.h>
#define Q 100
#define MAX 0x3f3f3f3f
int n,s;
int map[Q][Q];
bool visit[Q];
int min[Q];


int dij(int m)
{
    int i,j;
    memset(min,MAX,sizeof(min));
    memset(visit,false,sizeof(visit));
    visit[0]=true;
    for(i=1;i<n;i++)
    min[i]=map[0][i];
    //for(j=0;j<n;j++)
            //printf("%d ",min[j]);
            //printf("\n");
    for(i=1;i<n;i++)
    {
            if(i==m)
            i++;
            for(j=0;j<n;j++)
            {
                            if(min[i]+map[i][j]<min[j]&&!visit[j])
                            min[j
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
```c #include <stdio.h> #include <stdlib.h> #define Max_Int 32767 #define MVNum 100 typedef char VerTexType; typedef int ArcType; typedef struct { VerTexType vexs[MVNum]; ArcType arcs[MVNum][MVNum]; int vexnum, arcnum; } AMGraph; int D[MVNum]; int Path[MVNum]; void CreateUDN(AMGraph *G) { int i, j, k, w; printf("请输入顶点数和边数:"); scanf("%d%d", &G->vexnum, &G->arcnum); printf("请输入顶点信息:"); for (i = 0; i < G->vexnum; i++) { scanf(" %c", &G->vexs[i]); } for (i = 0; i < G->vexnum; i++) { for (j = 0; j < G->vexnum; j++) { G->arcs[i][j] = Max_Int; } } printf("请输入边的信息:\n"); for (k = 0; k < G->arcnum; k++) { printf("请输入第%d条边的下标i,j和权值w:", k + 1); scanf("%d%d%d", &i, &j, &w); G->arcs[i][j] = w; G->arcs[j][i] = w; } } void ShortestPath_DIJ(AMGraph G, int v0) { int S[MVNum]; int i, j, k, min; for (i = 0; i < G.vexnum; i++) { D[i] = G.arcs[v0][i]; S[i] = 0; if (D[i] < Max_Int) { Path[i] = v0; } else { Path[i] = -1; } } D[v0] = 0; S[v0] = 1; for (i = 1; i < G.vexnum; i++) { min = Max_Int; for (j = 0; j < G.vexnum; j++) { if (S[j] == 0 && D[j] < min) { k = j; min = D[j]; } } S[k] = 1; for (j = 0; j < G.vexnum; j++) { if (S[j] == 0 && D[k] + G.arcs[k][j] < D[j]) { D[j] = D[k] + G.arcs[k][j]; Path[j] = k; } } } } int main(void) { int i, j; AMGraph G; CreateUDN(&G); ShortestPath_DIJ(G, 0); for (i = 1; i < G.vexnum; i++) { if (D[i] == Max_Int) { printf("0无法到达%c\n", G.vexs[i]); } else { printf("0到%c的权值为:%d\n", G.vexs[i], D[i]); } } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值