题解
据说这道题,要将开关当作权值来做,默认状态下为0,改变后为1,
即当前车站点第一条边边权为0,其余都是1,然后已知起点和终点,跑一边最短路就行
最短路三大法宝:floyd、dijkstra、spfa
据说正解应该是双端队列广搜 看不懂题解不写了
最短路code:
#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1e3+10;
int f[N][N];
int n, st,ed;
int main()
{
cin>>n>>st>>ed;
memset(f, INF, sizeof f);
//floyd建边
for (int i = 1,x; i <= n; i++) {
cin>>x;
for (int j = 1,y; j <= x; j++) {
cin>>y;
if(j==1)f[i][y]=0;//默认开关
else f[i][y]=1;
}
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if(i==j||i==k||j==k)continue;//floyd里i j k不可以相等
if(f[i][k]!=INF&&f[k][j]!=INF)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
}
}
if(f[st][ed]!=INF)cout<<f[st][ed]<<endl;
else puts("-1");
return 0;
}