描述
TZC的店铺比较多,上次WY随便走只要能走到就行,现在他学聪明了。WY去买东西的话,确定一家店以后,当然他先要想想怎么样走到那家店走的路最少。店与店之间是有走的方向的,从店A到店B可以,店B到店A未必可以。店与店之间是有一定距离的。
上面就是路线,为方便起见,店铺都用数字表示,0表示WY的起点,店与店之间以及起点与店距离用d表示。WY从0开始到4店铺 那么最短路线为0-->3-->2-->4 总长为 60。
如果从0店铺开始到1店铺最短路线只有0-->1 总长 10。
当然也有可能没有路的情况。
输入
输入有多组测试数据。
每组数据的第一行为整数n(n<=10),表示店铺总数。所有店铺的编号为0~n-1。
接下来有若干行,每行为3个整数
a b t
表示a编号的店铺走向b编号的店铺之间的一条路径,长度为t。0<=a,b<n(为有向路径,不能反向行走)。
当a b t的值为0 0 0 表示店铺之间的路径输入完毕,不做任何处理。
最后一行输入店铺的编号k(k<n)
输入n为0时表示结束程序。
输出
输出从店铺0到k店铺的最短路线的长度。如果没有路的话,输出 NO WAY!
题目大意:输出0-n的最短路径
解题思路:最短路
解法一:floyd 可以求每两个点之间的最小距离
#include <iostream> #include <algorithm> using namespace std; #define INF 1e8 int main() { int map[11][11]; int n,m,i,j,k; while(cin>>n&&n){ for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(i==j) map[i][j]=0; else map[i][j]=INF; } } int a,b,c; while(cin>>a>>b>>c&&(a!=0||b!=0||c!=0)) map[a][b]=c; for(k=0;k<n;k++){ for(i=0;i<n;i++){ for(j=0;j<n;j++){ map[i][j]=min(map[i][j],map[i][k]+map[k][j]); } } } //模板 cin>>m; if(map[0][m]!=INF) cout<<map[0][m]<<endl; else cout<<"NO WAY!"<<endl; } return 0; }
解法二
Dijkstra 求单源最短路
#include <iostream> #include <algorithm> using namespace std; #define INF 1e8 int main() { int map[11][11]; int d[11]; int vis[11]; int n,m,i,j,k,a,b,c,Min; while(cin>>n&&n){ for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(i==j) map[i][j]=0; else map[i][j]=INF; } } while(cin>>a>>b>>c&&(a||b||c)) map[a][b]=c; for(i=0;i<n;i++){ d[i]=map[0][i]; vis[i]=1; } for(i=0;i<n;i++){ Min=INF; k=i; for(j=0;j<n;j++){ if(Min>d[j]&&vis[j]==1){ Min=d[j]; k=j; } } vis[k]=0; for(j=0;j<n;j++){ d[j]=min(d[j],d[k]+map[k][j]); } } cin>>m; if(d[m]==INF) cout<<"NO WAY!"<<endl; else cout<<d[m]<<endl; } }