从新把最短路整理一下
先从起点遍历讲与起点有直接联系的点记录距离dis
而后选出当前dis最小且没使用过的结点 k
而后用此结点更新其他没使用的结点,
(更新方法,假设更新n点,那么比较起点直接到n和起点到k的最小值再到n的大小)
#include<stdio.h>
#include<string.h>
#define MAX 10005
#define ff 1000000
int map[MAX][MAX]; //路径
int vis[MAX]; //判断点是否使用
int prev[MAX]; //记录父亲
int dis[MAX]; //起点到该点最短距离
int n,m; //点,边
int st,ed; //起点终点
void dijkstar()
{
int i,j;
for(i=0;i<n;i++) //进行第一次遍历
{
dis[i]=map[st][i];
if(dis[i]!=ff)
{
prev[i]=st;
}
else
prev[i]=-1;
}
dis[st]=0; //初始化起始点
vis[st]=1;
for(i=1;i<n-1;i++)
{
int k=st;
int min=ff;
for(j=0;j<n;j++) //选出当前最小权值点
{
if(!vis[j])
{
if(dis[j]<min)
{
min=dis[j];
k=j;
}
}
}
vis[k]=1;
for(j=0;j<n;j++) //遍历未使用过得点
{
if(dis[j]>dis[k]+map[k][j])
{
dis[j]=dis[k]+map[k][j];
prev[j]=k;
}
}
}
}
void dfs(int d)
{
if(d==st)
return;
else
{
dfs(prev[d]);
printf("->%d",d);
}
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%d%d",&st,&ed);
memset(vis,0,sizeof(vis));
memset(prev,0,sizeof(prev));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
map[i][j]=ff;
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
map[a][b]=map[b][a]=c;
}
dijkstar();
printf("%d\n",dis[ed]);
printf("%d",st);
dfs(ed);
printf("\n");
}