P1346 电车 · 最短路/双端队列广搜

题解

据说这道题,要将开关当作权值来做,默认状态下为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;
}
发布了43 篇原创文章 · 获赞 0 · 访问量 1261

猜你喜欢

转载自blog.csdn.net/Yubing792289314/article/details/104018074
今日推荐