这题思路还是挺简单的:
如果从一个站出发,能够在同一条线路抵达某站,在它们之间连一条边权为 $1$ 的边,建完图后写个最短路就好了。
这里求最短路用的是Floyd,直接交的话会TLE
,但是吸了氧就可以过了。
开O1 258 ms O2 294 ms O3 257 ms 很玄学
#pragma GCC optimize("O1")
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=505;
int g[N][N];
int stop[N];
int m,n;
int main(){
memset(g,0x3f,sizeof g);
cin>>m>>n;
string line;
getchar();
while(m--){
getline(cin,line);
stringstream ssin(line);
int k;
int cnt=0;
while(ssin>>k) stop[++cnt]=k;
for(int i=1;i<=cnt-1;i++)
for(int j=i+1;j<=cnt;j++)
g[stop[i]][stop[j]]=1;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
if(g[1][n]!=INF) cout<<max(g[1][n]-1,0)<<endl;
else cout<<"NO"<<endl;
return 0;
}
我心想着 $floyd$怎么过呢
但其实不吸氧也可以过 9 个点,要么是数据水了要么是它的速度确实接近过了😄
吸氧可耻!(虽然我也吸)
巧了,我也是floyd,开了O(2)跑了293ms(比您少一点点),其他没试