#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int map[7][7]={
0,2,4,1,pow(2,30)-1,pow(2,30)-1,pow(2,30)-1,
2,0,pow(2,30)-1,3,10,pow(2,30)-1,pow(2,30)-1,
4,pow(2,30)-1,0,2,pow(2,30)-1,5,pow(2,30)-1,
1,3,2,0,2,8,4,
pow(2,30)-1,10,pow(2,30)-1,2,0,pow(2,30)-1,6,
pow(2,30)-1,pow(2,30)-1,5,8,pow(2,30)-1,0,1,
pow(2,30)-1,pow(2,30)-1,pow(2,30)-1,4,6,1,0,
};
int main(){
int n=7;
int src=0;
int known[n];
int dist[n];
int parent[n];
for(int i=0;i<n;i++){
known[i]=-1;
if(i==src){
dist[i]=0;
}else{
dist[i]=pow(2,30)-1;
}
parent[i]=-1;
}
for(int i=0;i<n;i++){
int min=pow(2,30)-1;
int m=-1;
for(int j=0;j<n;j++){
if(known[j]==-1&&dist[j]<min){
min=dist[j];
m=j;
}
}
known[m]=1;
for(int j=0;j<n;j++){
if(known[j]==-1&&map[m][j]+dist[m]<dist[j]){
dist[j]=map[m][j]+dist[m];
parent[j]=m;
}
}
}
printf("从V%d到各顶点的最短路径为:\n",src);
for(int i=0;i<n;i++){
if(i!=src){
int temp=i;
while(temp!=src){
printf(" V%d <-",temp);
temp=parent[temp];
}
printf(" V%d 路径长度为%d\n",src,dist[i]);
}
}
return 0;
}