#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 生成】
代码中存在多处错误:
在Dijkstra函数的for循环中,第二个for循环的控制变量应该是i而不是j。
在Dijkstra函数中,计算距离时使用了错误的索引。应该使用a[x][j]而不是a[n*x+j]。
在主函数中,第一个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;
}