样例可过,下载的数据点可过但没有分
#include<bits/stdc++.h>
using namespace std;
int m,n,tot=1,head[550],f[550],Tot,dist[550],vis[550],x;
string s;
queue<int>q;
struct data{
int to,nxt,w;
}edge[250250];
void add(int u,int v,int w){
edge[tot].nxt=head[u];
edge[tot].to=v;
edge[tot].w=w;
head[u]=tot++;
}
void spfa(int s){
memset(dist,0x3f,sizeof dist);
memset(vis,0,sizeof vis);
dist[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty()){
int x=q.front();
q.pop();
vis[x]=0;
for(int i=head[x];i;i=edge[i].nxt){
int y=edge[i].to;
if(dist[x]+edge[i].w<dist[y]){
dist[y]=dist[x]+edge[i].w;
if(vis[y]==0){
q.push(y);
vis[y]=1;
}
}
}
}
}
signed main(){
cin>>m>>n;
getline(cin,s);
for(int i=1;i<=m;i++){
getline(cin,s);
memset(f,0,sizeof f);
Tot=0;
s+=" ";
for(int j=0;j<s.size();j++){
if(s[j]==' '){
for(int k=1;k<=Tot;k++){
add(f[k],x,1);
}
Tot++;
f[Tot]=x;
x=0;
}
else{
x=x*10+(s[j]-'0');
}
}
}
spfa(1);
if(dist[n]==0x3f){
cout<<"NO";
}
else{
cout<<dist[n]-1;
}
return 0;
}