洛谷p1359题,一道模板求最短路径的题,没写出来,请各位道友看一下代码

img


上述题目
我用的dijkstra算法:

img

img


我的代码输出不了,估计中间有地方错了

#include<stdio.h>
#define INF 37628
void Dijkstra(int **a,int dist[],int v,int n)
{    
      int mark[201];    
       int i,j,min,x;
       for(i=0;i<=n;i++)
    {
        mark[i]=0;
        dist[i]=*((int *)a+n*v+j);
    }
    mark[v]=1;
    for(i=1;i<n;i++)
    {
        min=INF;
        for(j=1;j<=n&&mark[j]==0;i++)    
        if(dist[j]<min)
        {
                min=dist[j];
                x=j;         
            }
        mark[x]=1;
        for(j=1;j<=n&&mark[j]==0;j++)
            if(dist[j]>dist[x]+*((int *)a+n*x+j)&&*((int *)a+n*x+j)<INF)
                dist[j]=dist[x]+*((int *)a+n*x+j);
    }
}
int main()
{
    int n,i,j;
    scanf("%d",&n);
    int edge[201][201];
    for(i=0;i<=n;i++)
        for(j=0;j<=n;j++)    
        edge[i][j]=INF;
    for(i=1;i<n;i++)
        for(j=i+1;j<=n;j++)
            scanf("%d",edge[i]+j);
    int dist[201];    
        Dijkstra((int **)edge,dist,1,n);
    printf("%d\n",dist[n]);
}

【以下回答由 GPT 生成】

代码中存在多处错误:

  1. 在Dijkstra函数的for循环中,第二个for循环的控制变量应该是i而不是j。

  2. 在Dijkstra函数中,计算距离时使用了错误的索引。应该使用a[x][j]而不是a[n*x+j]。

  3. 在主函数中,第一个for循环应该从1开始而不是从0开始。

下面是修改后的代码:

#include<stdio.h>
#define INF 37628

void Dijkstra(int **a, int dist[], int v, int n) {
    int mark[201];
    int i, j, min, x;
    for(i = 0; i <= n; i++) {
        mark[i] = 0;
        dist[i] = a[v][i];
    }
    mark[v] = 1;
    for(i = 1; i < n; i++) {
        min = INF;
        for(j = 1; j <= n && mark[j] == 0; j++) {
            if(dist[j] < min) {
                min = dist[j];
                x = j;
            }
        }
        mark[x] = 1;
        for(j = 1; j <= n && mark[j] == 0; j++) {
            if(dist[j] > dist[x] + a[x][j] && a[x][j] < INF) {
                dist[j] = dist[x] + a[x][j];
            }
        }
    }
}

int main() {
    int n, i, j;
    scanf("%d", &n);
    int edge[201][201];
    for(i = 1; i <= n; i++) {
        for(j = i+1; j <= n; j++) {
            scanf("%d", &edge[i][j]);
        }
    }
    int dist[201];
    Dijkstra((int **)edge, dist, 1, n);
    printf("%d\n", dist[n]);
    return 0;
}

希望这次的修改能够解决你的问题,如果还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

供参考:

#include <stdio.h>
#define N 201
#define min(a,b)  ((a) > (b) ? (b) : (a))
int main()
{
    int  n, i, j, k, map[N][N] = { 0 };
    scanf("%d", &n);
    for (i = 1; i <= n; i++) {
        for (j = i + 1; j <= n; j++)
            scanf("%d", &map[i][j]);
    }
    for (i = 1; i <= n; i++) {   // 出发地点为 i,枚举每一个出发地点
        for (j = i + 1; j <= n; j++) { // 目的地点为 j,枚举每一个 i 后面的目的地点
            for (k = i + 1; k < j; k++) // 枚举每一个中转站 k 
                map[i][j] = min(map[i][j], map[i][k] + map[k][j]); //得到 i 到 j 的最少租金 i < j
        }
    }
    printf("%d", map[1][n]); // 输出 1 到 n 的最少租金
    return 0;
}