【洛谷习题】电车

题目链接: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 }
AC代码

猜你喜欢

转载自www.cnblogs.com/Mr94Kevin/p/9545032.html
今日推荐