//这个版本使用了huilu数组存放这个点的前一个合理点;
//while( no_s(v-1,s) )//当所求的点不在s中,这语句严格来说是求点(v-1)这个点到始点的路径
//for(i=0;i<v;++i)//这条语句能求所有点的最短路径
//前两句也适应前版本
///粘贴输入下列
4 4
0 1 1
0 3 1
0 2 3
//while( no_s(v-1,s) )//当所求的点不在s中,这语句严格来说是求点(v-1)这个点到始点的路径
//for(i=0;i<v;++i)//这条语句能求所有点的最短路径
//前两句也适应前版本
///粘贴输入下列
4 4
0 1 1
0 3 1
0 2 3
2 3 4
#include <iostream>
using namespace std;
//012345分别表示v0 v1......
int v;//点数目
int edge;///边数目
int si=0;//si用来控制s数组的位置
int** draw();//绘图
int no_s_l_min(int* s,int* l);//不在s数组中的l数组中最小的点
int no_s(int k,int* s);//不在s数组中的
void digui_shuchu(int k,int *huilu);//递归输出
int main(int argc, char const *argv[])
{
int i;
int**a=draw();
//------------------------------------------------------------------------//
int* s=new int[v];//存放ok了的标记,si用来控制s数组的位置
for ( i = 0; i < v; ++i)s[i]=32767;
//------------------------------------------------------------------------//
int* l=new int[v];//存放i点到0点的路径长度
for ( i = 0; i < v; ++i)l[i]=32767;
//------------------------------------------------------------------------//
int* huilu=new int[v];//存放i点的前一个合理点
for ( i = 0; i < v; ++i)huilu[i]=-1;
//------------------------------------------------------------------------//
l[0]=0;
int u;//不属于s的并且l【u】最小的一个顶点
huilu[0]=0;
//------------------------------------------------------------------------//
while( no_s(v-1,s) )//当所求的点不在s中
{
u=no_s_l_min(s,l);
s[si++]=u;
for ( i = 0; i < v; ++i)
{
if (no_s(i,s) && a[u][i]<32767 && i!=u)
{
if (l[u]+a[u][i] < l[i])//lenth和路径将会改变
{/更换i的所有数据
l[i]=l[u]+a[u][i];
huilu[i]=u;
}
}
}
}
//------------------------------------------------------------------------//
cout<<"0";
digui_shuchu(v-1,huilu);
return 0;
}
int** draw()//绘图
{
int i,j;
cin>>v>>edge;///输入点数目和边数目
int **a=new int*[v];
for ( i = 0; i < v; ++i)
a[i]=new int[v];
for ( i = 0; i < v; ++i)
for ( j = 0; j < v; ++j)
a[i][j]=32767;
int spot1,spot2,len;
for ( i = 0; i < edge; ++i)
{
cin>>spot1>>spot2>>len;
a[spot1][spot2]=len; a[spot2][spot1]=len;
}
///-------------------------------------------------------------///
for ( i = 0; i < v; ++i){
for ( j = 0; j < v; ++j)
cout<<a[i][j]<<" ";
cout<<"\n";
}
cout<<"\n";
return a;
}
int no_s_l_min(int* s,int *l)//不再s数组中的l数组中最小的点
{
int mark=0;
int min;
for (int i = 0; i < v; ++i)
{
if(no_s(i,s) )//不在s数组里的点vi
{
if(mark==0){min=i;mark=1;}//必然会执行一次,初始化min
else
{
if (l[min] > l[i])
min=i;
}
}
}
return min;//返回Vmin;
}
int no_s(int k,int* s)
{
for (int i = 0; i <= si; ++i)
if(s[i]==k)return 0;//点vk不再s[i]中
return 1;
}
void digui_shuchu(int k,int *huilu)
{
if (k!=0)
{
digui_shuchu(huilu[k],huilu);
cout<<k;
}
else return;
}