c++djistra,并且记录路径

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值