m0_57117352 2022-04-20 20:23 采纳率: 81.3%
浏览 3
已结题

迪杰斯特拉算法,不知道该怎么来记录所途径的路径

该怎么改才能记录路径啊,感觉哪里都不是很合适,要用二维数组吗?感觉套在了那个循环里面

#include<stdio.h>
#define max 50
#define M 999
void DJ(int G[max][max],int n,int m,int v,int visit[]);
int main()
{
int G[max][max];//图
int n,m,v;//定点数、边数、初始点
int visit[max];
int i,j,x,y,w;
printf("输入顶点数和边数:\n");
scanf("%d,%d",&n,&m);
//初始化
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
{
G[i][j]=0;
}
else
{
G[i][j]=M;
}
}
}
printf("输入顶点和全值\n");
for(i=1;i<=m;i++){
scanf("%d,%d,%d",&x,&y,&w);
G[x][y]=w;
}
printf("输入初始点");
scanf("%d",&v);
DJ(G,n,m,v,visit);
}
void DJ(int G[max][max],int n,int m,int v,int visit[])
{
int dist[max];//用于存放路径长度
int i,j,min,u;
for(i=0;i<n;i++)
{
visit[i]=0;
}
visit[v]=1;
for(i=0;i<n;i++)
{
dist[i]=G[v][i];
}
//选择一个到v边长最小的边
for(j=0;j<n-1;j++)
{
min=M;
for(i=0;i<n;i++)
{
if(!visit[i]&&min>dist[i])
{
min=dist[i];
u=i;
}
}

 visit[u]=1;
 for(i=0;i<n;i++)
 {
     if(dist[i]>dist[u]+G[u][i])
     {
         dist[i]=dist[u]+G[u][i]; 
     }
 }

}
for(i=0;i<n;i++)
{
    printf("%d->%d的距离为:%d\n",v,i,dist[i]);
}

 
 

}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 4月28日
    • 创建了问题 4月20日

    悬赏问题

    • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
    • ¥30 截图中的mathematics程序转换成matlab
    • ¥15 动力学代码报错,维度不匹配
    • ¥15 Power query添加列问题
    • ¥50 Kubernetes&Fission&Eleasticsearch
    • ¥15 報錯:Person is not mapped,如何解決?
    • ¥15 c++头文件不能识别CDialog
    • ¥15 Excel发现不可读取的内容
    • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
    • ¥20 yolov5自定义Prune报错,如何解决?