首页 > 其他分享 >【题解】Luogu[P2296] [NOIP2014 提高组] 寻找道路

【题解】Luogu[P2296] [NOIP2014 提高组] 寻找道路

时间:2023-08-02 15:36:40浏览次数:68  
标签:NOIP2014 int 题解 到达 终点 Luogu NR ct

Link

很简单的一道图论题。

要在一个有向图上找一条 \(s\) 到 \(t\) 的最短路,要求这条路径上的所有点都满足:该点的所有出边所连点都能到达终点 \(t\)。

看上去很乱,我们简单分解一下,先在所有点中找到与终点有路径的点集 \(A\) 进行标记,再再所有点中找到其所有出边所连点都被打上标记的点集 \(B\)。

很容易证明 \(B\subseteq A\),因为对于任意一点 \(x\in B\) 则说明 \(x\) 必可到达与之相连的点 \(y\),其中 \(y\in A\),又因为 \(y\) 可到达 \(t\),所以 \(x\) 必可到达 \(t\),所以 \(\forall x\in B,x\in A\)。

于是思路就很明确了,先找到 \(A\),再在 \(A\) 中找 \(B\),最后在 \(B\) 中跑一遍最短路即可。这里因为边权都为 \(1\),跑 01bfs 即可。

这里对于找 \(A\),我们发现直接从起点开始找很难找,我们不妨再建一个反图,从终点开始找,就很好找了。

code

#include<bits/stdc++.h>
using namespace std;
const int NR=1e4+5;
int n,m;
vector<int>e[NR],g[NR];
int s,t;
bool ct[NR],lt[NR];
int dis[NR];
queue<int>q;
void dfs(int u){
    ct[u]=true;
    for(int i=0;i<e[u].size();++i){
        int v=e[u][i];
        if(!ct[v])dfs(v);
    }
}
void bfs(){
    dis[s]=1,q.push(s);
    while(!q.empty()){
        int u=q.front();q.pop();
        if(u==t){cout<<dis[t]-1;exit(0);}
        for(int i=0;i<g[u].size();++i){
            int v=g[u][i];
            if(lt[v]&&!dis[v])
                dis[v]=dis[u]+1,q.push(v);
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1,u,v;i<=m;++i)
        cin>>u>>v,e[v].push_back(u),g[u].push_back(v);
    cin>>s>>t;
    ct[t]=true,dfs(t);
    if(!ct[s]){cout<<-1<<endl;return 0;}
    for(int i=1;i<=n;++i)
        if(ct[i]){
            lt[i]=true;
            for(int j=0;j<g[i].size();++j)
                if(!ct[g[i][j]]){lt[i]=false;break;}
        }
    if(!lt[s]){cout<<-1<<endl;return 0;}
    bfs();
    cout<<-1<<endl;
    return 0;
}

标签:NOIP2014,int,题解,到达,终点,Luogu,NR,ct
From: https://www.cnblogs.com/agrumestly/p/17600782.html

相关文章

  • 国标GB28181视频平台LntonGBS国标平台调用快照接口,未能正常返回快照图片的问题解决方
    LntonGBS国标视频云服务支持设备/平台通过国标GB28181协议注册接入,可实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。LntonGBS平台便捷、丰富、灵活、可拓展的视频能力,已经使其成为当前安防市场的主流需求视频平台,并且已经在大量的项目中落地......
  • 【题解】HDOJ 7329 [2023杭电多校] Touhou Red Red Blue
    题目传送门:HDOJ7329[2023杭电多校]TouhouRedRedBlue题意有两个口袋(口袋容量为1,初始均为空),有若干个UFO按顺序来到你的面前,每个UFO有一个颜色(GRB),你可以选择扔掉它或者把它装进口袋中,如果口袋1空着必须装进口袋1;如果口袋都满了,算上面前的UFO共有三个,有如下三种情况:如......
  • [刷题笔记] Luogu P2340 [USACO03FALL] Cow Exhibition G
    ProblemSolution乍看可能没有思路。我们注意到本题是牵扯到一头奶牛选or不选的问题,非常自然地想到01背包。接下来我们就尝试将本题背景转换成01背包问题。我们可以将智商转换成容量,情商转换成价值。(当然反过来也可)然后就可以套用01背包板子了:\[f_{i,j}=min(f_{i-1,j},f_{i-1......
  • NOI2023 题解
    打的太shaber了,于是补补题。D1T1扫描线。首先我们可以容斥一下,答案为被一种操作覆盖到的减去被两种操作覆盖到的加上被三种操作覆盖到的。首先考虑只被一种操作覆盖到的,这很简单,直接上个区间颜色段推平就好了,顺便去了个重。接下来是有被斜线覆盖到的,这样的点数为\(O(nk)\)......
  • 因MySQL数据库无法启动导致LiteCVR视频平台也无法启动的问题解决教程
    近期呢,我们的数据人员发现有时候MySQL数据库无法启动会导致LiteCVR视频平台也无法启动,所以接下来我们将为大家讲解遇见这种问题时的解决教程。但是在这之前值得一提的一件事那就是我们的LiteCVR平台默认的数据库是SQLite,不过用户可以根据自己的使用需求选择将数据库切换为MySQL。具......
  • [MySQL] 调用定时器时event_scheduler是Off问题解决
    永久解决方法:修改MySQL配置文件,设置event_scheduler=ONvi/etc/my.cnf在[mysqld]下添加一行重启mysql服务event_scheduler=ON临时方法执行mysql语句1、查看事件调度器状态showVARIABLESlike'event_scheduler'......
  • 统信UOS专业版 apt update失败问题解决方法
    UOSaptupdate时提示‘仓库“https://pro-store-packages.uniontech.com/appstoreeagle-proInRelease”的签名不再生效’只需要更改/etc/apt/sources.list.d/appstore.list文件内容,改为debhttps://com-store-packages.uniontech.com/appstoredeepinappstore同时,建......
  • ABC311E 题解
    看到官方题解是\(O(n^2)\)的dp。提供一个\(O(n^2\log_2n)\)的做法,考场思路,大概比较简单。Description给一个\(H\)行\(W\)列的网格,其中一些点被涂成黑色,求整个正方形内都未被涂黑的正方形的个数。Solution考场上首先想到的简单暴力做法,即枚举正方形左上角端点,然......
  • CF1594A 题解
    题意\(t\)组数据(\(1\let\le1000\)),每组数据给一个整数\(n\)(\(1\len\le10^{18}\)),找出两个整数\(l\)和\(r\)($-10^{18}\lel<r\le10^{18}$)使$l+(l+1)+\ldots+(r-1)+r=n$。思路看到这个题目,首先会想到\(l=n\)且\(r=n\),但是发现题目要求\(......
  • CF1702E 题解
    题意\(t\)组数据($1\let\le10^{4}$),每组数据给一个偶数\(n\)(\(2\len\le2\cdot10^{5}\)),有\(n\)个多米诺骨牌,每块多米诺骨牌包含两个整数\(a_{i}\)和\(b_{i}\)(\(1\lea_{i},b_{i}\len\)),要求把这\(n\)块多米诺骨牌分入两个集合使得每个集合中的数互不相同,每个......