题意分析:从饭店到s公园的最少换乘次数。
解法:
将一组数据的车进行连通,列如4 7 3 6,连接的方法为4——7,4——3,4——6,7——3…依次进行,并将边的权值全部为1,那也就是说求饭店到公园的最短路径。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<sstream>
using namespace std;
const int N =510;
int n,m;
int dist[N];
int stop[N];
int q[N];
bool g[N][N];
void bfs()//求1到n的最小值
{
int hh=0,tt=0;
memset(dist,0x3f,sizeof dist);
q[0]=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;
getline(cin,line);
while(m--)
{
getline(cin,line);
stringstream ssin(line);
int cnt=0,p;
//ssin为将字符流中的信息流到p中。
while(ssin>>p) stop[cnt++]=p; //cnt为每一行的数的个数从0到cnt
for(int j=0;j<cnt;j++)
for(int k=j+1;k<cnt;k++)
g[stop[j]][stop[k]]=true; //将j和k之间进行连接。
}
bfs();
if(dist[n]==0x3f3f3f3f) puts("NO");
else cout<<max(dist[n]-1,0)<<endl;
return 0;
}