ps:主要是3个一维数组,一个是dist[],用来储存源点到达各点的距离(比如dist[2]=3就是源点到达2的距离是3),一个是off[],是用来记录是否作为扩散点扩散了.

另一个是path[],用来记录到达某点的前驱点.然后就是构图了,map[a][b]=c;

代码:

#include "stdio.h"
#include "string.h"
#define MAX 1000000
int dist[100];
int off[100];
int map[100][100];
int path[100];
void mm(int a);
int main(){
    int n,m,i,j,k,a,b,c;
    int min1;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            map[i][j]=MAX;
        }
    }
    for(i=0;i<m;i++){
        scanf("%d%d%d",&a,&b,&c);
        map[a][b]=c;
        map[b][a]=c;
    }
    scanf("%d",&a);
    for(i=1;i<=n;i++){
        dist[i]=map[a][i];   //初始化 
        if(dist[i]==MAX){
            path[i]=-1;
        }
        else
            path[i]=a;
    }
    dist[a]=0;           //选择扩散点,并标记为1 
    off[a]=1;
    for(i=2;i<=n;i++){
        min1=MAX;
        //k=a;
        for(j=1;j<=n;j++){    //找出扩散点附近尚未扩散过的点最短的距离 
            if((!off[j]) && dist[j]<min1){
                k=j;
                min1=dist[j];
            }
        }
        off[k]=1;     //进行扩散,并标记 
        for(j=1;j<=n;j++){
            if((!off[j]) &&map[k][j]<MAX){     
                if(dist[k]+map[k][j] < dist[j]){
                    dist[j]=dist[k]+map[k][j];
                    path[j]=k;
                }
            }
        }
    }
    for(i=1;i<=n;i++){
        printf("到达%d的最短路径为%d\n",i,dist[i]);
        mm(i);
    }
    return 0;
    
}
void mm(int a){
    int k=a;
    printf("%d",a);
    while(path[a]!=-1){
             printf("->%d",path[a]);
            a=path[a];
    }
    printf("\n");
}