题面
题解
问题转化 :换乘多少次 可以转换为 乘坐过多少次车减1
建图:在同一条路线中,任意一个在此路线上的车站均能沿着该路线的方向到达 后面的车站,权值都是1,表示只乘坐一次车 ;通过建图,由于权值均是1,使用bfs求出1号点到n号点最少乘过多少次车
代码
#include<bits/stdc++.h>
using namespace std;
const int N=510;
int n,m;
bool g[N][N];
int dist[N];
int stop[N];
int q[N];
void bfs(){
memset(dist,0x3f,sizeof dist);
int hh=0,tt=-1;
q[++tt]=1;
dist[1]=0;
while(hh<=tt){
int t=q[hh++];
for(int i=1;i<=n;i++){
if(g[t][i]&&dist[i]>dist[t]+1){
dist[i]=dist[t]+1;
q[++tt]=i;
}
}
}
}
int main(){
cin>>m>>n;
string line;
getchar();
for(int i=0;i<m;i++){
getline(cin,line);
stringstream ssin(line);
int cnt=0,p;
while(ssin>>p) stop[cnt++]=p;
for(int j=0;j<cnt;j++){
for(int k=j+1;k<cnt;k++){
g[stop[j]][stop[k]]=true;
}
}
}
bfs();
if(dist[n]==0x3f3f3f3f) cout<<"NO"<<endl;
else cout<<max(dist[n]-1,0)<<endl;
return 0;
}