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

题解:P2296 [NOIP2014 提高组] 寻找道路

时间:2025-01-11 14:46:11浏览次数:1  
标签:10005 NOIP2014 int 题解 back dfs vis P2296

条件第一步,要能到达 \(t\) 点,建反图跑一遍。记录哪些点可行。

第二步,扫描每个点,若其旁边均为标记过的,说明点的出边所指向的点都直接或间接与终点连通。记录这个点第二次

第三步,在原边枚举每条边,若两个节点均被记录了第二次,加入一个新图,否则扔掉。

对新图进行 BFS 即可。

代码:

#include<bits/stdc++.h>
using namespace std;
int n, m, s, t, vis[10005], can[10005], dis[10005];
vector<int> g[10005], f[10005], h[10005];
void dfs(int u){
    vis[u] = 1;
    for(int i = 0; i < g[u].size(); i ++){
        if(!vis[g[u][i]]){
            dfs(g[u][i]);
        }
    }
}
queue<int> q;
int main(){
    cin >> n >> m;
    for(int i = 1; i <= m; i ++){
        int u, v; cin >> u >> v;
        f[u].push_back(v); g[v].push_back(u);
    }
    cin >> s >> t;
    dfs(t);
    for(int i = 1; i <= n; i ++){
        can[i] = 1;
        for(int j = 0; j < f[i].size(); j ++){
            can[i] = min(can[i], vis[f[i][j]]);
        }
    }
    for(int i = 1; i <= n; i ++){
        for(int j = 0; j < g[i].size(); j ++){
            if(can[i] && can[g[i][j]]) h[g[i][j]].push_back(i);
        }
    }
    for(int i = 1; i <= n; i ++) dis[i] = -1;
    q.push(s); dis[s] = 0;
    while(q.size()){
        int now = q.front(); q.pop();
        for(int i = 0; i < h[now].size(); i ++){
            if(dis[h[now][i]] == -1){
                dis[h[now][i]] = dis[now] + 1;
                q.push(h[now][i]);
            }
        }
    }
    cout << dis[t];
    return 0;
}

标签:10005,NOIP2014,int,题解,back,dfs,vis,P2296
From: https://www.cnblogs.com/zhangzirui66/p/18665592

相关文章

  • 题解:P2822 [NOIP2016 提高组] 组合数问题
    组合数,还是多测,考虑预处理所有答案。组合数的递推公式如下,证明在本文底部:\[C_{i,j}=C_{i-1,j}+C_{i-1,j-1}\]由于求的是是否能被\(k\)整除,转化式子为:\[C_{i,j}=(C_{i-1,j}+C_{i-1,j-1})\bmodk\]易得若\(C_{i,j}=0\)即为可整除。但这样每次......
  • 洛谷B3733 [信息与未来 2017] 基因组分析密码锁题解
    [信息与未来2017]密码锁题目描述乌龟给自己的贵重物品上了密码锁。密码锁上有5 个数字拨盘。每个数字拨盘每次向上拨使数字增加1 (9 向上拨得到0),向下拨使数字减少1 (0 向下拨得到9)。拨盘上的数字组成一个5 位数。只要拨盘上的数字变为素数,密码锁就会被解开。素......
  • CF1759F题解
    BriefDescription给你一个\(n\)位的\(p\)进制数,第\(i\)位为\(a_i\)。请问最少要让该数加多少次\(1\),可以让数码\(0,\cdots,p−1\)都出现过(包含在中间过程出现)。Solution因为是\(p\)进制,不难发现答案一定不会超过\(p−1\),也就是说在最坏情况下就是其最后一位加至......
  • THUPC 2025 初赛 部分题题解
    持续更新中,目前只有\(\texttt{A,D,G,H,I,M}\)题题解。A.骑行计划题目描述小Rei有\(n\)天的假期,第\(i\)天她要骑行\(s_i\)分钟,每分钟骑行费用为\(c\)元。有\(m\)种骑行卡,第\(i\)种骑行卡售价\(w_i\)元,有效期\(d_i\)天,免费时间\(t_i\)分钟。小Rei可以......
  • AT_aising2020_f 题解
    AT_aising2020_fTwoSnuke题意:对于一个十元组\((a_1,a_2,b_1,b_2,c_1,c_2,d_1,d_2,e_1,e_2)\),定义它合法当且仅当满足下列条件:\(0\lea_1<a_2\)\(0\leb_1<b_2\)\(0\lec_1<c_2\)\(0\led_1<d_2\)\(0\lee_1<e_2\)\(a_1+a_2+b_1+b_2+c_1+c_......
  • AT_abc248_h [ABC248Ex] Beautiful Subsequences 题解
    题目传送门前置知识树状数组|序列分治解法考虑序列分治,设因\(\max\)和\(\min\)形成的分节点先后为\(k_{1},k_{2}\)。对于\(j\in(mid,k_{1}]\),等价于统计满足\(\max\limits_{h=i}^{mid}\{a_{h}\}-\min\limits_{h=i}^{mid}\{a_{h}\}\lej-i+k\)的\(j\)的......
  • 题解:CF1031F Familiar Operations
    传送门Solution之前有遇到类似的题,第一步先考虑转化操作和问题。对于每个数质因数分解成\(\prod{p_i^{\alpha_i}}\),我们所需要的只有\(\alpha_i\),因为只要求因子个数相同。记其为\(S_i=\{\alpha_1,\alpha_2,\dots,\alpha_k\}\),其中\(\alpha_1\geq\alpha_2\geq\dots......
  • Atcoder ABC329E Stamp 题解 [ 绿 ] [ 线性 dp ]
    Stamp:难点主要在dp转移的细节与分讨上,但通过改变状态设计可以大大简化分讨细节的题。观察首先要有一个观察:只要某一个前缀能被覆盖出来,那么无论它后面多出来多少,后面的字符串都可以帮他重新覆盖回去。这也就是dp为啥没有后效性的原因。除此之外,还要注意一个字符串不仅能在......
  • 跟我一起学 Python 数据处理(二十六):PDF 数据提取技巧与问题解决策略
    跟我一起学Python数据处理(二十六):PDF数据提取技巧与问题解决策略在Python数据处理的学习之旅中,我们已经走过了不少路程,今天继续深入探索PDF文件处理的核心技巧与方法,旨在帮助大家进一步提升数据处理能力,解决实际工作中遇到的难题。一、slate库处理PDF文件的深入......
  • D. Smithing Skill 和 D. Grid Puzzle的题解
    D.SmithingSkill:https://codeforces.com/problemset/problem/1989/D思路:https://blog.csdn.net/weixin_73936404/article/details/140045020(看这位的博客吧,这个本人第一次写卡住了,题解就当复盘了)贪心:优先消耗值小的(花费和返回的差值)且门槛小的。代码:#include<bits/stdc......