#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>const int MAX=32767;const int N=6;
int edge[N+1][N+1]={{0,0,0,0,0,0,0},{0,0,1,12,0,0,0},{0,0,0,9,3,0,0},{0,0,0,0,0,5,0},{0,0,0,4,0,13,15},{0,0,0,0,0,0,4},{0,0,0,0,0,0,0}};voiddisplay(int R[]){for(int i=1;i<=N;i++){printf("%3d\t",R[i]);}printf("\n");}
int dijkstra(bool Y[],int edge[][N+1]){
int R[N+1]={MAX,};
int index=0,i,j;for(i=2;i<=N;i++){if(edge[1][i])R[i]=edge[1][i];elseR[i]=MAX;}while(1)//执行n-1次{display(R);for(i=1,index=0;i<=N;i++)//寻找最优源{if(Y[i]&&R[i]<R[index]){
index=i;//当前最优源}}if(index==0)break;//无源可取Y[index]=false;//取最优源for(j=1;j<=N;j++){if(edge[index][j]&&R[index]+edge[index][j]<R[j]){R[j]=R[index]+edge[index][j];//最优路径转移}}}return0;}
int dijkstra_hs(){
int X[N+1]={0,1,};
int Y[N+1]={0,0,1,1,1,1,1};
int R[N+1]={0,};for(int i=2;i<=N;i++){if(edge[1][i])R[i]=edge[1][i];elseR[i]=MAX;}for(i=2;i<=N;i++){display(R);X[i]=1;Y[i]=0;for(int j=1;j<=N;j++){if( edge[i][j]&&(R[i]+edge[i][j]<R[j])){R[j]=R[i]+edge[i][j];if(X[j])//对新路径回溯{
i=j-1;break;}}}}return0;}
int main(){
bool Y[N+1]={false,true,true,true,true,true,true};dijkstra(Y,edge);printf("\n");dijkstra_hs();return0;}/*
void display(int c[4][4])
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
printf("%3d",c[i][j]);
}printf("\n");
}
}*/