求最短路径以及记录路径输出 wzy的大冒险——出发咯QAQ

 wzy的大冒险——出发咯QAQ

单点时限: 2.0 sec

内存限制: 512 MB

wzy踏上了冒险的旅程。
现在他从地精手里买了一份地图,地图上有n个城镇。
他从第一个城镇出发,走向(没钱只能走)第n个城镇,现在,请你帮wzy找到一条最短的路径,并倒序(从n到1)输出一条最短路径。
举个栗子:如果有两条路径6 4 3 1和6 5 2 1,我们选择6 4 3 1这条。
地精小提示:路是单向的QAQ。

输入格式

第一行两个数n,m ,(1≤n≤103,1≤m≤103)

接下来m行,每行三个数x,y,z,表示点 x 与点 y 之间有一条权值为 z 的有向边 (1≤x,y,z≤103).

输出格式

第一行一个整数表示 1 到 n 的最短距离;
第二行倒序输出这条路径。

样例

input

5 7
1 2 69
1 3 87
1 4 79
2 5 94
2 3 10
3 5 79
4 5 43

output

122
5 4 1

关键是利用d【maxn】数组去保存路径 然后进行输出  以及一些存图操作

#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1e3+10;
typedef long long ll;
int way[maxn][maxn];
int dis[maxn];
int flag[maxn];
int d[maxn]; 
int n,m;
int dijkstra()
{
	memset(dis,0,sizeof(dis));
	for(int i=1;i<=n;i++)
	{
		dis[i]=way[1][i];
		if(way[1][i]!=INF)
		{
			d[i]=1; 
		 } 
	}
	flag[1]=1;dis[1]=0;
	int x;
	for(int i=1;i<=n;i++) 
	{
		int ans=INF;
		for(int j=1;j<=n;j++)
		{
			if(ans>dis[j]&&!flag[j])
			{
				ans=dis[j];
				x=j;
			}
		}
		flag[x]=1;
		for(int i=1;i<=n;i++)
		{
			if(!flag[i])
			{
				if(dis[i]>dis[x]+way[x][i])
				{
					dis[i]=dis[x]+way[x][i];
					d[i]=x;
				}
			}
		 } 
	}
 }
 int main()
 {
 	cin>>n>>m;
 	for(int i=1;i<=n;i++)
 	{
 		for(int j=1;j<=n;j++)
 		{
 			way[i][j]=INF; 
		 }
	 }
	 for(int i=1;i<=m;i++)
	{
	 	int a,b,c;
	 	cin>>a>>b>>c;
	 	way[a][b]=c;
	}
	dijkstra();
	cout<<dis[n]<<endl;
	int t=n;
	cout<<n<<" ";
	int s=1;
	while(t!=1)
	{
		t=d[t];
		if(s)
		{
			cout<<t;
			s=0; 
		}
		else cout<<" "<<t; 
	 }
	 return 0;
  } 

 

上一篇:[NOIP模拟测试]:Star Way To Heaven(最小生成树Prim)


下一篇:NOIP的模板---考前复习