题解 NOIP 2014 寻找道路

NOIP 2014 寻找道路

题目描述 Description

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

输入描述 Input Description

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

输出描述 Output Description

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

样例输入输出

【样例输入#1】 Sample Input#1

3 2
1 2
2 1
1 3

【样例输出#1】 Sample Output#1

-1

【样例输入#2】 Sample Input#2

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

【样例输出#2】 Sample Output#2

3

样例输入输出说明

【解释1】


如上图所示,箭头表示有向道路,圆点表示城市。起点1与终点3不连通,所以满足题
目᧿述的路径不存在,故输出- 1 。

【解释2】

Mou icon

如上图所示,满足条件的路径为1 - >3- >4- >5。注意点2不能在答案路径中,因为点2连了一条边到点6,而点6不与终点5连通。

图转自洛谷

数据范围及提示 Data Size & Hint

对于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。

题解

我一开始拿到这道题的时候就认为这题不是一道bfs模板题吗,但后来发现要满足规则一并不是单纯的bfs模板跑一遍能解决的,所以我想到先从终点反向跑一遍bfs将能到达的点进行标记,然后再正向跑bfs,只遍历标记过的点即可
代码如下

C++代码

/*
    Name: Find the Way
    Copyright: Ricardo_Y_Li
    Author: Ricardo_Y_Li
    Date: 11/07/17 15:37
    Description: NULL
*/

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue> 
using namespace std;

vector<int>map_z[10010],map_f[10010];
//定义正向图与反向图 
queue<int>q;
bool vis_z[10010],vis_f[10010];//正向标记与反向标记 
int dis[10010];//dis[i]表示点i到起点的距离 
int n,m,s,e;

bool check(int x){//检查点x是否符合规则一 
    int len=map_z[x].size()-1;
    for(int i=0;i<=len;i++){
        int v=map_z[x][i];
        if(!vis_f[v])//若没标记则返回0 
            return 0;
    }
    return 1;
}

void bfs_z(){//正向bfs找最短路 
    while(!q.empty())//清空队列 
        q.pop();
    q.push(s);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        int len=map_z[u].size()-1;
        if(!check(u))
            continue;
        for(int i=0;i<=len;i++){
            int v=map_z[u][i];
            if(!vis_z[v]){
                vis_z[v]=1;
                dis[v]=dis[u]+1;
                q.push(v);
            }
            if(v==e){//找到终点直接返回 
                return;
            }
        }
    }
    
}

void bfs_f(){//反向bfs进行标记 
    while(!q.empty())//清空队列 
        q.pop();
    q.push(e);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        int len=map_f[u].size()-1;
        for(int i=0;i<=len;i++){
            int v=map_f[u][i];
            if(!vis_f[v]){
                vis_f[v]=1;
                q.push(v);
            }
        }
    }
    return;
}

int main(){
    ios::sync_with_stdio(false);
    memset(vis_z,0,sizeof(vis_z));
    memset(vis_f,0,sizeof(vis_f));
    memset(dis,-1,sizeof(dis));
    //把距离都初始化成-1,若无法到达就直接输出-1了 
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        map_z[x].push_back(y);
        map_f[y].push_back(x);
    }
    cin>>s>>e;
    dis[s]=0;//起点到自己的距离肯定为0 
    vis_f[e]=1;//反向标记时先把终点自己标记上 
    bfs_f();
    bfs_z();
    cout<<dis[e];
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,...
    bbqub阅读 439评论 0 0
  • 树形动态规划,顾名思义就是树+DP,先分别回顾一下基本内容吧:动态规划:问题可以分解成若干相互联系的阶段,在每一个...
    Mr_chong阅读 1,435评论 0 2
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,712评论 0 33
  • 《产品日思录》是我个人公众号上每天更新的系列文章,记录了我在做产品过程中的思考、总结、经验积累,也希望在这里和简书...
    s2dongman申悦阅读 652评论 0 1
  • 两个月没回广州了,一个温暖潮湿的,杜绝手凉的地方。 接起一个020打头的电话,同学你好我们公司本周六有宣讲会,你方...
    柳不浪阅读 119评论 0 0