#include<stdio.h> #include<windows.h> int a[10][10]; int arc[10];//记录弧的端点 int cost[10];//记录从起始点到当前i点的距离 int use[10];//记录当前i点是否被使用 void path(int n){ for(int i=0;i<n;i++){//初始赋值默认所有点从点0开始,该点的路径前缀点为0,use[i]未被使用 cost[i]=a[0][i]; arc[i]=0; use[i]=0; } use[0]=1;//默认0为起点,将0加入最短路径 for(int i=1;i<n;i++){//默认最后的路径必为连通图 int j=1; //记录当前循环下标 int k=0; //记录目前已知的未知点路径最短的点下标 int min=65535; //比较值默认65535为不可达 while(j<n){ if(use[j]==0&&cost[j]>0&&cost[j]<min){//判断条件:当前点未用且路径比目前最短的路径端 k=j; min=cost[i]; } j++; } use[k]=1;//标记该点到起点的路径已知 printf("%d,%d\n",k,cost[k]); for(int i=0;i<n;i++){ printf("%d ",cost[i]); } printf("\n"); system("pause"); for(int t=0;t<n;t++){ //更新由已知新的算出来最短路径的点到剩余的点的路径的长度,条件:可达且未被用,更新后的值比当前的值小 if(a[k][t]>0&&a[k][t]<65535&&use[t]==0&&a[k][t]+cost[k]<cost[t]){ cost[t]=a[k][t]+cost[k]; arc[t]=k; } } } for(int i=0;i<n;i++){ printf("%d ",arc[i]); } } int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&a[i][j]); } } path(n); }
时间: 2024-11-06 15:02:45