题目链接:https://www.luogu.org/problemnew/show/P1346
题目不难,如果将切换开关次数看做边权,跑一遍最短路就是答案。因为数据范围很小,所以用最容易写的Floyd就可以。只不过初始化时需要注意,先将最短路全部设为inf,如果从一个点到另一个点之间有路径,那么最短路应为1或0(若边的终点恰好是起点的第一个连向的点,则为0)。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=105,inf=0x3f3f3f3f; 6 int n,a,b,G[maxn][maxn]; 7 void floyd() { 8 for(int k=1;k<=n;++k) 9 for(int i=1;i<=n;++i) 10 for(int j=1;j<=n;++j) 11 G[i][j]=min(G[i][j],G[i][k]+G[k][j]); //状态转移 12 } 13 int main() { 14 scanf("%d%d%d",&n,&a,&b); 15 int cnt,v; 16 memset(G,inf,sizeof(G)); 17 for(int i=1;i<=n;++i) { 18 scanf("%d",&cnt); 19 for(int j=1;j<=cnt;++j) {scanf("%d",&v);G[i][v]=j==1?0:1;} //初始化 20 } 21 floyd(); 22 if(G[a][b]==inf) printf("-1"); //特判无法连通 23 else printf("%d",G[a][b]); 24 return 0; 25 }