【数据结构】BOJ-6.1最短路径(*dij算法更新了)

在这里插入图片描述
输入:1,4
输出:1,2,4,7,6,

代码拙劣 勿喷
在这里插入图片描述

网上抄来的dijikstra算法:

#include <stdio.h>
#define N 99999
#define MAX 8

void Dijkstra(int G[MAX][MAX],int S) {

    int Dist[MAX] = {0};//存储结点到始发点的距离
    int Known[MAX] = {0};//存储已确定最短路径的点
    int Path[MAX] = {0};//存储走最短路径结点上一个点
    
    //数组初始化
    Known[S] = 1;
    for (int i = 0; i < MAX; ++i)
    {
        Dist[i] = G[S][i];
        if(G[S][i]!=N)
            Path[i] = S;
    }
    int count = 1;
    Path[S] = 0;
    
    while (count < MAX - 1) {
        
        //寻找当前dist中最小的加入known;
        int V = 0;
        for (int j = 1; j < MAX; ++j){
            if (Dist[V] > Dist[j] && !Known[j])
                V = j;
        }
        Known[V] = 1;//加入known
        count++;

        //更新与当前V相连点的距离
        for (int i = 1; i < MAX; ++i) {
            if (Dist[V] + G[V][i] < Dist[i] && !Known[i]) {
                Dist[i] = Dist[V] + G[V][i];
                Path[i] = V;
            }
        }
    }
//此处更改终点
    int p = 6;
    while(p != 0 ){
        printf("%d,",p);
        p = Path[p];
    }//自行倒序哈
}

    int main() {
        int d[MAX][MAX] = {
                //{0,1,2,3,4,5,6,7};
                {N,N,N,N,N,N,N,N},//0
                {N,0,2,N,1,N,N,N},//1
                {N,N,0,N,3,10,N,N},//2
                {N,4,N,0,N,N,5,N},//3
                {N,N,N,2,0,2,8,4},//4
                {N,N,N,N,N,0,N,6},//5
                {N,N,N,N,N,N,0,N},//6
                {N,N,N,N,N,N,1,0},//7
        };
        //此处更改起始点
        Dijkstra(d, 1);
        return 0;
}



比较简短的Floyd算法:

#include <stdio.h>
#define N 1000
int main(){
    int i,k,j;
    int A[7][7]={
            {N,2,N,1,N,N,N},//1
            {N,N,N,3,10,N,N},//2
            {4,N,N,N,N,5,N},//3
            {N,N,2,N,2,8,4},//4
            {N,N,N,N,N,N,6},//5
            {N,N,N,N,N,N,N},//6
            {N,N,N,N,N,1,N},//7
    };
    scanf("%d,%d",&i,&j);
    A[i-1][j-1] = N;
    int P[7][7],D[7][7];
    for(i = 0; i < 7; i++){
        for(k = 0; k < 7; k++){
            D[i][k] = A[i][k];
            P[i][k] = k;
        }
    }
    for(j = 0; j < 7; j++){
        for(i = 0 ; i < 7; i++){
            for(k =0; k < 7; k++){
                if(D[i][k] > (D[i][j] + D[j][k])){
                    D[i][k] = D[i][j] + D[j][k];
                    P[i][k] = P[i][j];
                }
            }
        }
    }
    j = P[0][5];
    printf("1,");
    while(j != 5){
        printf("%d,", j + 1);
        j = P[j][5];
    }
    printf("6");
}```

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值