#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<bits/stdc++.h>
const int inf=100000;
using namespace std;
int main()
{
int n,e,begin,end;
int dis[1000];//任何一点到起始点的最短距离
bool check[1000];
int graph[100][100];
int path[1000];
memset(path,-1,sizeof(path));
memset(check,0,sizeof(check));
memset(dis,1000000,sizeof(dis));
memset(graph,0,sizeof(graph));
scanf("%d%d",&n,&e);//n个点,e条边
for(int i=1;i<=e;i++)//注意从1开始
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
graph[a][b]=c;//从a点到b点的一条边长c
}
scanf("%d%d",&begin,&end);//起点和终点的编号
dis[begin]=0;
path[begin]=-1;
for(int i=1;i<=n;i++)//保证每一个点都要被遍历
{
int minn=1000000,minx;//minn表示从起点到该点的最短距离,minx为当前点出发的,所连接的最短的点
for(int j=1;j<=n;j++)//j就是当前点
{
if(check[j]==0&&dis[j]<minn)//如果当前的点到起始点的距离尚未被确认为最短,并且从起始点到当前点的距离小于上一次更新的距离
{
minn=dis[j];//记忆最短距离
minx=j;//第二层第一个for循环结束后,可以确定minx点到起始点的距离 已经最短
}
}
check[minx]=1;
for(int j=1;j<=n;j++)//遍历与当前点有连接的周边点
{
if(graph[minx][j]>0)//如果当前点与周边点有连接
{
if(minn+graph[minx][j]<dis[j])// 本条if说明如果绕路可以获得更短的路程
{
dis[j]=minn+graph[minx][j];//则绕路,并且记忆
path[j]=minx;
}
}
}
}
int p=end;
stack <int> s;
s.push(end);
while(path[p]!=-1)
{
s.push(path[p]);
p=path[p];
}
printf("%d\n",dis[end]);
while(!s.empty())
{
printf("%d",s.top());
if(s.top()!=end)printf("->");
s.pop();
}
return 0;
}
c++djistra,并且记录路径
最新推荐文章于 2024-10-06 10:17:48 发布