• NOIP2014 day2 t2 寻找道路


    寻找道路

    NOIP2014 day2 t2

    描述

    在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点的路径,该路径满足以下条件:
    1.路径上的所有点的出边所指向的点都直接或间接与终点连通。 2.在满足条件 1 的情况下使路径最短。 注意:图 G
    中可能存在重边和自环,题目保证终点没有出边。 请你输出符合条件的路径的长度。

    输入格式

    第一行有两个用一个空格隔开的整数 n 和 m,表示图有 n 个点和 m 条边。 接下来的 m 行每行 2 个整数
    x、y,之间用一个空格隔开,表示有一条边从点 x 指向点 y。 最后一行有两个用一个空格隔开的整数 s、t,表示起点为 s,终点为 t。

    输出格式

    输出只有一行,包含一个整数,表示满足题目᧿述的最短路径的长度。如果这样的路 径不存在,输出-1。

    备注

    输入样例1

    3 2 1 2 2 1 1 3

    输出样例1

    -1

    输入样例2

    6 6 1 2 1 3 2 6 2 5 4 5 3 4 1 5

    输出样例2

    3

    数据说明 对于30%的数据,0< n≤10,0< m≤20; 对于60%的数据,0< n≤100,0< m≤2000;
    对于100%的数据,0< n ≤10,000,0< m≤ 200,000,0< x,y,s,t≤n,x≠t。

    思路:
    先建反图 从终点DFS判断能否到达。
    再连边从正向BFS搜到终点就可以啦。

    // by SiriusRen
    #include <queue>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    queue<int>q;
    int n,m,from[400500],to[400500],tot=0,vis[20050],s,e,V[20050];
    int v[400500],first[20050],next[400050];
    void add(int x,int y){v[tot]=y;next[tot]=first[x];first[x]=tot++;}
    void dfs(int x){
        for(int i=first[x];~i;i=next[i])
            if(!vis[v[i]])vis[v[i]]=1,dfs(v[i]);
    }
    bool check(int x){for(int i=first[x];~i;i=next[i])if(!vis[v[i]])return 1;return 0;}
    int main(){
        scanf("%d%d",&n,&m);
        memset(first,-1,sizeof(first));
        for(int i=1;i<=m;i++)
            scanf("%d%d",&from[i],&to[i]),add(to[i],from[i]);
        scanf("%d%d",&s,&e);
        vis[e]=1;dfs(e);
        memset(first,-1,sizeof(first));
        for(int i=1;i<=m;i++)add(from[i],to[i]);
        V[s]=1;q.push(s);
        while(!q.empty()){
            int t=q.front();q.pop();
            if(check(t))continue;
            for(int i=first[t];~i;i=next[i]){
                if(!V[v[i]])V[v[i]]=V[t]+1,q.push(v[i]);
                if(v[i]==e){printf("%d
    ",V[t]);return 0;}
            }
        }
        puts("-1");
    }
  • 相关阅读:
    NOI online2022题解
    【考试总结】20220331
    【考试总结】20220329
    【考试总结】20220327
    【考试总结】20220328
    【考试总结】20220326
    ElementUI使用vif控制tab标签显示遇到的Duplicate keys detected: 'xxx' 数据主键key重复
    ElementUI 的Tree Tree 菜单树形控件
    Element表格单元格的几种点击事件
    haproxy安装步骤及注意事项
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532401.html
Copyright © 2020-2023  润新知