#include<iostream>
#define INF 10000 //取合适的值作为无穷大表示无边
using namespace std;
int n=7; //顶点数
int G[7][7]=
{
{INF,9,INF,INF,INF,INF,INF},
{9,INF,12,5,INF,INF,7},
{INF,12,INF,6,INF,INF,INF},
{INF,5,6,INF,14,8,INF},
{INF,INF,INF,14,INF,3,INF},
{INF,INF,INF,8,3,INF,10},
{INF,7,INF,INF,INF,10,INF}
}; //图的邻接矩阵
void Dijkstra(int v0)
{
int minCostPer[n],join[n];//minCostPer[]存的是各个节点到起点的路径最小值
int minValue,path[n];//path[]存的最短路径上,当前节点的前一个节点
int v=v0;
for(int i=0; i<n; i++)
{
minCostPer[i]=G[v][i];
join[i]=0;
if(G[v][i]<INF)
{
path[i]=v;
}
else
{
path[i]=-1;
}
}
join[v]=1;//起点加入路径
path[v]=-1;//起点没有前一个节点,标记为-1
for(int i=0; i<n-1; i++)
{
minValue=INF;
for(int j=0; j<n; j++)
{
if(join[j]==0&&minCostPer[j]<minValue)
{
minValue=minCostPer[j];
v=j;
}
}
join[v]=1;
for(int j=0; j<n; j++)
{
if(join[j]==0&&G[v][j]<INF&&minCostPer[v]+G[v][j]<minCostPer[j])
{
minCostPer[j]=minCostPer[v]+G[v][j];
path[j]=v;
}
}
}
for(int i=0; i<n; i++)
{
cout<<minCostPer[i]<<" ";
}
}
int main()
{
Dijkstra(0);//以符号标志为0的节点作为起点
/*
path[]里的元素值应为:-1 0 3 1 5 3 1
minCostPer[]里的元素值应为:10000 9 20 14 25 22 16
*/
return 0;
}