POJ - 1847 Tram(最短路)

it2022-07-06  208

题目链接:点击查看

题目大意:火车从起点开到终点,轨道上有很多岔路口,每个岔路口都有很多方向(火车能够选择任意一个方向行驶),但是默认

的是第一个方向,如果要选择其他的方向需要增加一次切换的操作,问最少需要切换几次可以从起点到达终点。

题目分析:这个题虽然题意有点难理解,但说实话我第一次读完题意后就能够理解题意了,但是却毫无思路,陷入了思维定势中。

因为这个题是在最短路专题中出现的,所以会下意识的往最短路上靠,不过最后还是看了别人的题解才豁然开朗,原来是个水题。

看来不能只做板子题,还是得多做点变形的题,加深对算法的理解才行啊!

大水题,n也比较小,偷个懒直接用的floyd暴力点做出来了,记得别忘了输出-1的情况,直接上代码了:

#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> #include<sstream> #include<cmath> using namespace std; typedef long long LL; const int inf=0x3f3f3f3f; const int N=110; int maze[N][N]; int main() { // freopen("input.txt","r",stdin); int n,st,ed; while(scanf("%d%d%d",&n,&st,&ed)!=EOF) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) maze[i][j]=i==j?0:inf; for(int i=1;i<=n;i++) { int k; scanf("%d",&k); for(int j=1;j<=k;j++) { int p; scanf("%d",&p); if(j==1) { maze[i][p]=0; } else { maze[i][p]=1; } } } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) { if(maze[i][k]==inf) continue; for(int j=1;j<=n;j++) maze[i][j]=min(maze[i][j],maze[i][k]+maze[k][j]); } if(maze[st][ed]==inf) cout<<-1<<endl; else cout<<maze[st][ed]<<endl; } return 0; }

 


最新回复(0)