最重要的事情是读题!
切换开关的状态后,它会自动复原我也不知道这是什么鬼开关
把每个节点看作是点,轨道看作是边。转换一次开关状态看作边权为1。由于题中n的范围是100,所以可以用最暴力好写的Floyd算法
#include<bits/stdc++.h>
using namespace std;
int n,s,e;//end是保留字
int d[107][107];//存图
int main(){
cin>>n>>s>>e;
memset(d,0x3f,sizeof(d));
for(int i=1;i<=n;++i)d[i][i]=0;//记得这一步,自己到自己的距离为0
for(int i=1;i<=n;++i){
int x;//即Ki,轨道数
cin>>x;
for(int j=1;j<=x;++j){
int y;
cin>>y;//另一端的路口
if(j==1)d[i][y]=0;//单行道。因为开关都是控制着“出去的道路”。而且本题中是出发去目的地,再回来没有意义。
else d[i][y]=1;//这里两处手残把i打成了x
}
}
for(int k=1;k<=n;++k)//k记得写在最外面
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);//Floyd
if(d[s][e]>=0x3f3f3f3f)cout<<-1<<endl;//中途某边其实是不存在的(边权为0x3f3f3f3f,因为memset按字节赋值)
else cout<<d[s][e]<<endl;//可以到达
return 0;
}
387

被折叠的 条评论
为什么被折叠?



