连好每个车站可以直接到达的点,设定距离为1,算出此时构成的图的最短路,实际意义为上车数,减1即为换车数。
代码实现:
#include<bits/stdc++.h>
#define N 500+10
using namespace std;
int n,m;
int d[N],bus[N],used[N];
int a[N][N];
vector<int>v[N];
int main(){
cin>>n>>m;
memset(a,0x3f,sizeof a);
for(int i=1;i<n;i++){
int cnt=1;char ch;
while(1){
cin>>bus[cnt];cnt++;
ch=getchar();
if(ch=='\n')break;
}
cnt--;
for(int i=1;i<cnt;i++)
for(int j=i+1;j<=cnt;j++)
a[bus[i]][bus[j]]=1;
}
int cnt=1;
while(cin>>bus[cnt])cnt++;
cnt--;
for(int i=1;i<cnt;i++)
for(int j=i+1;j<=cnt;j++)
a[bus[i]][bus[j]]=1;
memset(d,0x3f,sizeof d);
memset(used,0,sizeof used);
d[1]=0;
for(int i=1;i<m;i++){
int x=0;
for(int j=1;j<=m;j++)
if(!used[j]&&(x==0||d[j]<d[x]))x=j;
used[x]=1;
for(int y=1;y<=m;y++)
d[y]=min(d[y],d[x]+a[x][y]);
}
if(d[m]>=0x3f3f3f3f/2)cout<<"NO";
else cout<<d[m]-1;
return 0;
}