题目描述
过暑假了,小E准备出行旅游,他已经查到了某些城市的两两之间的距离及可行路线(可行路线有方向),如下图所示。请你编程计算从小E所住城市到其它城市的最短路径以帮助小E制定旅行计划。
输入
输入由若干行组成,第一行有三个整数 n(1≤n≤100) 为城市数,m(1≤m≤n*n) 为城市间道路数,s(0≤s≤n−1) 是小E所住城市。
第 2 至 m+1 行是每条路的信息,每行三个整数,为道路的起点、终点和两城市间距离。(城市从 0 开始编号)
输出
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 99999999
#define MAX_N 100
int n,m,v;
int dis[MAX_N];
int map[MAX_N][MAX_N];
int path[MAX_N];
int cost[MAX_N];
bool used[MAX_N];
void dijkstra(int s)
{
fill(dis,dis+n,INF);
dis[s]=0;
path[s]=-1;
memset(used,0,sizeof(used));
while(true)
{
int tv=-1;
for(int u=0;u<n;u++) if(!used[u] && (tv==-1 || dis[tv]>dis[u])) tv=u;
if(tv==-1) break;
used[tv]=true;
for(int u=0;u<n;u++) if(!used[u] && dis[u]>dis[tv]+map[tv][u])
{
path[u]=tv;
dis[u]=dis[tv]+map[tv][u];
}
}
}
int fpath[MAX_N];
int fcnt;
void PrintPath(int p)
{
if(p!=-1)
{
PrintPath(path[p]);
fpath[fcnt++]=p;
}
}
int main()
{
cin>>n>>m>>v;
for(int i=0;i<n;i++) for(int j=0;j<n;j++) map[i][j]=INF;
for(int i=0;i<m;i++)
{
int b,e,c;
cin>>b>>e>>c;
map[b][e]=c;
}
dijkstra(v);
for(int i=0;i<n;i++)
{
cout<<i<<":"<<endl;
if(dis[i]==INF || path[i]==-1) cout<<"no"<<endl;
else
{
cout<<"path:";
fcnt=0;
PrintPath(i);
for(int j=0;j<fcnt-1;j++)
{
cout<<fpath[j]<<" ";
}
cout<<fpath[fcnt-1]<<endl;
cout<<"cost:"<<dis[i]<<endl;
}
}
return 0;
}