1807. [NOIP2014]寻找道路P2296 寻找道路

题目描述

在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:

1 .路径上的所有点的出边所指向的点都直接或间接与终点连通。

2 .在满足条件1 的情况下使路径最短。

注意:图G 中可能存在重边和自环,题目保证终点没有出边。

请你输出符合条件的路径的长度。

输入输出格式

输入格式:

输入文件名为road .in。

第一行有两个用一个空格隔开的整数n 和m ,表示图有n 个点和m 条边。

接下来的m 行每行2 个整数x 、y ,之间用一个空格隔开,表示有一条边从点x 指向点y 。

最后一行有两个用一个空格隔开的整数s 、t ,表示起点为s ,终点为t 。

输出格式:

输出文件名为road .out 。

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

说明

解释1:

如上图所示,箭头表示有向道路,圆点表示城市。起点1 与终点3 不连通,所以满足题

目᧿述的路径不存在,故输出- 1 。

解释2:

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

对于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,算出每一个点的访问次数

然后把不能走的点删去

最后spfa带走

一个很有意思的能够找出访问次数而且不会死循环的方法

1 int to=edge[i].v;

2 if(cs[to]++)continue;
3 q.push(to); 
完整代码
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<queue>
  6 #define INF 0x7ffffff
  7 using namespace std;
  8 int read(int & n)
  9 {
 10     int flag=0,x=0;char c='/';
 11     while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
 12     while(c>='0'&&c<='9')x=x*10+(c-48),c=getchar();
 13     if(flag)n=-x;else n=x;
 14 }
 15 const int MAXN=200001;
 16 int n,m,bgx,bgy;
 17 int rudu[MAXN];
 18 struct node
 19 {
 20     int u,v,w,nxt;
 21 }edge[MAXN];
 22 int num=1;
 23 int head[MAXN];
 24 int flag[MAXN];// 记录每个值是否能够到达终点 
 25 int cs[MAXN];
 26 int dis[MAXN];
 27 int vis[MAXN];
 28 void add_edge(int ll,int rr,int ww)
 29 {
 30     edge[num].u=ll;
 31     edge[num].v=rr;
 32     edge[num].w=ww;
 33     edge[num].nxt=head[ll];
 34     head[ll]=num++;
 35 }
 36 void bfs()
 37 {
 38     queue<int>q;
 39     int tot=0;
 40     q.push(bgx),tot++;
 41     while(q.size()!=0)
 42     {
 43         int p=q.front();
 44         q.pop();
 45         for(int i=head[p];i!=-1;i=edge[i].nxt)
 46         {
 47             int to=edge[i].v;
 48             if(cs[to]++)continue;
 49             q.push(to);
 50         }
 51     }
 52     //rudu[bgy]=0;
 53     for(int i=1;i<=n;i++)
 54         if(rudu[i]!=cs[i]&&i!=bgy)
 55             flag[i]=1;
 56 }
 57 void dele()
 58 {
 59     for(int i=1;i<=num;i++)
 60     {
 61         if(flag[edge[i].u]!=0)
 62         {
 63             edge[i].u=-1;
 64             edge[i].v=-1;
 65             edge[i].w=-1;
 66             edge[i].nxt=-1;
 67         }
 68     }
 69 }
 70 void spfa()
 71 {
 72     queue<int>q;
 73     q.push(bgx);
 74     dis[bgx]=0;
 75     while(q.size()!=0)
 76     {
 77         int p=q.front();
 78         q.pop();
 79         vis[p]=0;
 80         for(int i=head[p];i!=-1;i=edge[i].nxt)
 81         {
 82             if(edge[i].u==-1)continue;
 83             int to=edge[i].v;
 84             if(dis[to]>dis[p]+edge[i].w)
 85             {
 86                 dis[to]=dis[p]+edge[i].w;
 87                 if(vis[to]==0)
 88                 {
 89                     vis[to]=1;
 90                     q.push(to);
 91                 }
 92             }
 93         }
 94     }
 95     if(dis[bgy]==INF)
 96     printf("-1");
 97     else
 98     printf("%d",dis[bgy]);
 99 }
100 int main()
101 {
102     freopen("roadb.in","r",stdin);
103     freopen("roadb.out","w",stdout);
104     read(n);read(m);
105     for(int i=1;i<=n;i++)head[i]=-1,dis[i]=INF;
106     for(int i=1;i<=m;i++)
107     {
108         int x,y;
109         read(x);read(y);
110         add_edge(y,x,1);
111         rudu[x]++;
112     }
113     read(bgy);read(bgx);
114     bfs();
115     dele();
116     spfa();
117     return 0;
118 }

 

转载于:https://www.cnblogs.com/zwfymqz/p/6899931.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html页面 wordpress,WordPress纯代码实现前端页面HTML完美压缩

前言&#xff1a;压缩HTML页面的好处就是略微提升页面加载速度&#xff0c;并给那些爱扒皮的缺德玩意制造些许麻烦。好了将如下代码添加在functions.php中即可&#xff1a;//压缩WordPress前端html代码function wp_compress_html(){function wp_compress_html_main ($buffer){$…

js中的作用域

关于变量和参数问题&#xff1a; 函数外面定义的变量是全局变量&#xff0c;函数内可以直接使用。 在函数内部没有使用var定义的变量则为全局变量&#xff0c;在函数内使用var关键字定义的变量是局部变量&#xff0c;即出了函数外边无法获取。 js函数定义的参数没有默认值&…

html HTML1300 进行了导航,jquery根据文章H标签自动生成导航目录

jquery根据文章H标签自动生成导航目录2017-11-19 20:57在一些旅游网站&#xff0c;比如说途牛、携程这些&#xff0c;当你看某条线路的详情页时&#xff0c;右边会有相应的第一天、第二天等的目录。这么大的网站&#xff0c;不可能后台添加行程的时候&#xff0c;每一天都要自动…

asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User

前言 很多时候其实我们并不需要asp.net core自带的那么复杂的用户系统&#xff0c;基于角色&#xff0c;各种概念&#xff0c;还得用EF Core&#xff0c;而且在web应用中都是把信息存储到cookie中进行通讯&#xff08;我不喜欢放cookie中&#xff0c;因为有次我在mac系统中的sa…

html的排版标题的是,HTML 5结构排版布局

进行总体布局时候&#xff0c;具体可以用的方法。1.大纲&#xff1a;文档中各内容区块的结构编排。内容区块可以使用标题元素来展示各级内容区块的标题。关于内容区块的编排可以分为“显示编排”和“隐式编排”。显示编排&#xff1a;明确使用section等元素创建文档结构&#x…

[LeetCode]Distinct Subsequences,解题报告

题目 Given a string S and a string T, count the number of distinct subsequences of T in S.A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative po…

2021年河南高考成绩排名查询一分一段表,2018河南高考一分一段统计表,查排名必备!...

原标题&#xff1a;2018河南高考一分一段统计表&#xff0c;查排名必备&#xff01;&#xff1a;点击这里信息省招办公布了2018年普通高招分数段统计表&#xff0c;对每个分数段有多少考生进行了详细统计。你考了多少分&#xff1f;处在哪个位置&#xff1f;快来看看&#xff0…

实用的css样式

当字数超过一行时&#xff0c;可以用...代替 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 这三个样式同时使用才有效&#xff0c;也可以去掉white-space样式&#xff0c;分两行 转载于:https://www.cnblogs.com/maggie-php/p/6906462.html

js滚轮换切屏

js滚轮换切屏 因为全项目不是自己写的&#xff0c;仅仅是帮别人写js滚轮代码&#xff0c;并且别人项目也还未上线。所以仅仅贴出自己写的那段部分代码&#xff0c; 效果&#xff1a;鼠标滚轮滚动时。网頁屏幕一屏一屏的上下切换 (下面代码在本地电脑的IE,chrome与FireFox这三个…

(2021|CoRR,AugCLIP,优化)FuseDream:通过改进的 CLIP+GAN 空间优化实现免训练文本到图像生成

FuseDream: Training-Free Text-to-Image Generation with Improved CLIPGAN Space Optimization 公众&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. CLIPGAN 文本到图…

中文邮件营销html模版,怎么制作邮件营销模板?— —邮件格式

怎么制作邮件营销模板&#xff1f;— —邮件格式U-Mail邮件营销平台发表时间 2017-09-21人气 757次做EDM邮件营销&#xff0c;需要有好的邮件群发工具&#xff0c;还要有好的内容&#xff0c;那么如何制作好邮件营销的模板呢&#xff1f;现在U-Mail邮件群发平台根据已有的一些经…

查询数据库中所有表名

查询数据库中所有表名select table_name from information_schema.tables where table_schemacsdb and table_typebase table; 查询指定数据库中指定表的所有字段名column_nameselect column_name from information_schema.columns where table_schemacsdb and table_nameusers…

【默认加入持久化机制,防止消息丢失,v0.0.3】对RabbitMQ.Client进行一下小小的包装,绝对实用方便...

RabbitMQ是一个老牌的非微软的消息队列组件&#xff0c;一般来说应该能满足中小型公司对消息队列生产的需求&#xff0c;平时我们在.NET开发环境下运用它是可能会需要RabbitMQ.Client的SDK库&#xff0c;此库是官网提供&#xff0c;目前最新发布版本是v4.1.3。在我们对接项目时…

angularJS中,怎么阻止事件冒泡

今天有个童鞋问我&#xff0c;ng怎么阻止事件冒泡&#xff0c;我就简单的贴一下代码吧&#xff0c;也不是什么好高大上的问题 转载于:https://www.cnblogs.com/leoshuaige/p/6910646.html

用html编写输出今天是星期几,利用Date对象编写程序,判断并输出今天是开学的第几周,星期几。...

利用Date对象编写程序&#xff0c;判断并输出今天是开学的第几周&#xff0c;星期几。(function(){var startDay new Date(2014,8,1); //根据指定的年月日时分秒设置开学时间为2014/09/01var startMs startDay.getTime();//返回1970年至今的毫秒var startYear startD…

Java中 break continue return 的区别

1、break break :跳出当前循环&#xff1b;但是如果是嵌套循环&#xff0c;则只能跳出当前的这一层循环&#xff0c;只有逐层break才能跳出所有循环&#xff1b; for (int i 0; i < 10; i) { if (i 6) { break; // 在执行i6时强制终止循环&#xff0c;i6不会被执行 }Sy…

用计算机画好看的图形,如何画一手漂亮的电脑效果图?技巧案例赏析!

原标题&#xff1a;如何画一手漂亮的电脑效果图&#xff1f;技巧&案例赏析&#xff01;电脑效果图是什么&#xff1f;很显然&#xff0c;用电脑去绘制设计师的想法。当然&#xff01;所有的设计意图&#xff0c;最终都是为了更准确的成衣。那么&#xff0c;能精准的表达出想…

朝花夕拾——finally/final/finalize拨云雾见青天

Java编程中。常常会使用到异常处理&#xff0c;而finally看似的是try/catch后对逻辑处理的完好&#xff0c;事实上里面却存在非常多隐晦的陷阱。final常见于变量修饰&#xff0c;那么你在内部类中也见过吧。finalize作为GC回收对象前的一道门&#xff0c;什么时候运行。运行效果…

Java读源代码学设计模式:适配器Adapter

适配器模式相关源代码&#xff1a;slf4j-1.6.1、hibernate-3.6.7大家都知道。log4j是一个广泛使用的日志工具&#xff0c;除此之外。sun公司在JDK中也有自己的日志工具&#xff0c;也就是java.util.logging.Logger。当然还有其它一些日志工具。多种日志工具功能和使用方式相似&…

适合文科女孩子学的计算机类专业,文科女生最吃香的专业2021 哪些专业有前景...

文科女生最吃香的专业2021 哪些专业有前景2021-03-27 14:36:27文/丁雪竹文科女生可以报考的专业并不是很多&#xff0c;小编整理了文科女生吃香的专业&#xff0c;来看一下&#xff01;文科女生最吃香的专业网络与新媒体这个专业是近几年流行起来的新兴专业&#xff0c;需求量还…