莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
1. 核心:对于每一辆车,每一个点都要向后面的所有点建一条边
2. 然后就是权值相等的 bfs 求最短路
#include<bits/stdc++.h>
using namespace std;
const int N = 510, INF = 0x3f3f3f3f;
int n,m;
int dist[N];
bool g[N][N];
int stop[N];
//求这个1号点到n号点的最短距离
int bfs()
{
memset(dist,0x3f,sizeof dist);
dist[1]=0;
queue<int> q;
q.push(1);
while(q.size())
{
auto t=q.front();
q.pop();
for(int i=1;i<=n;i++)
if(g[t][i]&&dist[i]>dist[t]+1)
{
dist[i]=dist[t]+1;
q.push(i);
}
}
}
int main()
{
cin>>m>>n;
string line;
getline(cin,line);
while(m--)
{
getline(cin,line);
stringstream ssin(line);
int cnt=0,p;
while(ssin>>p) stop[cnt++]=p;
//对于每一辆车,每一个点都要向后面的所有点建一条边
for(int i=0;i<cnt;i++)
for(int j=i+1;j<cnt;j++)
g[stop[i]][stop[j]]=true;
}
bfs();
if(dist[n]==INF) cout<<"NO"<<endl;
else cout<<max(dist[n]-1,0)<<endl;
return 0;
}