我竟然一个人敲了NOIP提高组的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

说明

解释1:

如上图所示,箭头表示有向道路,圆点表示城市。起点11与终点33不连通,所以满足题目描述的路径不存在,故输出−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 ≤10000, 0 < m ≤ 200000,0<n≤10000,0<m≤200000,0<x,y,s,t≤n,x,s≠t。


由题意 只需要跑一遍最短路 重点注意处理不符合要求的点

只需要反向建图,再用BFS找到所有原图中不能到达终点的点(即反向建图后终点不能到达的点),标记为book[i]=0;

再用O(m)的复杂度扫描每一条边,如果与点i联通的点中有book[j]=0的,则标记mark[i]=0(注意不是book[i]=0,原因在于点i本身可以到达终点)。

上代码

#include<iostream>
#include<queue>
#include<cstring>
#include<utility>
#include<cstdio>
#define inf 0x3f3f3f3f
using namespace std;
int n,m,head1[],head2[],num1,num2,vst[],a,b,book[],s,t,d[],mark[];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q1;
struct edge
{
int u,v,nxt;
}e1[],e2[];
queue<int> q;
void add1(int u,int v)
{
e1[++num1].u=u,e1[num1].v=v;
e1[num1].nxt=head1[u],head1[u]=num1;
}
void add2(int u,int v)
{
e2[++num2].u=u,e2[num2].v=v;
e2[num2].nxt=head2[u],head2[u]=num2;
}
int main()
{
memset(head1,-,sizeof head1);
memset(head2,-,sizeof head2);
memset(d,inf,sizeof d);
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
if(a==b)continue;
add1(a,b);
add2(b,a);//反向建图
}
scanf("%d%d",&s,&t);
book[t]=;
q.push(t);
while(!q.empty())
{
int st=q.front();
q.pop();
for(int i=head2[st];i!=-;i=e2[i].nxt)
{
if(book[e2[i].v]==)continue;
book[e2[i].v]=;
q.push(e2[i].v);
}
}//BFS
for(int i=;i<=n;i++)mark[i]=;
for(int i=;i<=n;i++)
{
for(int j=head1[i];j!=-;j=e1[j].nxt)
{
if(book[e1[j].v]==)mark[e1[j].u]=;
}
}//记录非法的点
q1.push(make_pair(,s));
d[s]=;
while(!q1.empty())
{
int x=q1.top().second;
q1.pop();
if(vst[x]==||mark[x]==)continue;
vst[x]++;
for(int st=head1[x];st!=-;st=e1[st].nxt)
{
if(d[e1[st].v]>d[e1[st].u]+)
{
d[e1[st].v]=d[e1[st].u]+;
q1.push(make_pair(d[e1[st].v],e1[st].v));
}
}
}//dijkstra最短路
if(d[t]==)
{
puts("-1");//无解输出-1
return ;
}
printf("%d",d[t]);
return ;
}

2019.6.5 NOIP2014 day2 t2 寻找道路的更多相关文章

  1. NOIP2014 day2 t2 寻找道路

    寻找道路 NOIP2014 day2 t2 描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的 ...

  2. NOIP2014 day2 T2寻找道路

    #include<iostream> #include<cmath> #include<cstdlib> #include<cstdio> #inclu ...

  3. 【DFS】【最短路】【spfa】【BFS】洛谷P2296 NOIP2014提高组 day2 T2 寻找道路

    存反图,从终点dfs一遍,记录下无法到达的点. 然后枚举这些记录的点,把他们的出边所连的点也全部记录. 以上这些点都是无法在最短路中出现的. 所以把两个端点都没被记录的边加进图里,跑spfa.BFS什 ...

  4. NOIP2014 day2 T2 洛谷P2296 寻找道路

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  5. [NOIP2014提高组]寻找道路

    题目:洛谷P2296.Vijos P1909.codevs3731.UOJ#19. 题目大意:给你一张有向图,边权为1,让你找一条s到t的最短路径,但这条路径上所有点的出边所指向的点都与终点连通.如果 ...

  6. [NOIp2014] luogu P2296 寻找道路

    不知道是因为我菜还是别的,最近老是看错题. 题目描述 在有向图 GGG 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向 ...

  7. 【DFS】【图论】NOIP2014寻找道路

    [NOIP2014]寻找道路 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所 ...

  8. NOIP2014 寻找道路

    2.寻找道路 (road.cpp/c/pas) [问题描述] 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指 ...

  9. 【洛谷P2296】[NOIP2014]寻找道路

    寻找道路 题目链接 这道题非常的水,按照题意, 先反向建边,从终点搜索,标记出可以到达终点的点 然后枚举一遍,判断出符合条件1的点 再从起点搜索一遍就可以了 #include<iostream& ...

随机推荐

  1. OpenGL(十五) OpenCV+OpenGL实现水面倒影

    有两幅原始图片,一个是景物图像,一个是水面图像,尝试生成景物在水中的倒影: 在OpenGL中,加载并显示这个景物图像可以把这个图像作为纹理载入即可,把图像直接选择180度的效果就相当于是在镜面中倒影的 ...

  2. UVE开发环境搭建及项目启动

    1.IDE安装visual studio code ,略: 2.node安装(node-v10.5.0-win-x64.zip),解压即可: 3.配置node环境变量,cmd 输入node -v.np ...

  3. 关于JSON 字段数据的直接查询

    最新的pgSQL 对json的支持在进一步加强!虽然我也学了那么点皮毛,但是json数据对于WEB的开发确实很重要,苦苦学习了很长一段时间,不断的关系PGSQL的动向! 好在翻看很多高人的例子和介绍, ...

  4. XF 显示网络图像

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. JS 中按键处理

    <script type="text/javascript">        //关于键的问题        onload = function () {        ...

  6. SICP 1.17-1.19

    1.16 -------------> 不考虑0的情况 <------------ (define (fe b n) (define (fet m c) (cond ((= m n) c) ...

  7. jquery 显示和隐藏的三种方式

     <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    & ...

  8. CPU和GPU双低效,摩尔定律之后一万倍 ——写于TPU版AlphaGo重出江湖之际

    本文来自计算机体系结构专家王逵.他认为,“摩尔定律结束之后,性能提升一万倍”不会是科幻,而是发生在我们眼前的事实.   2008年,<三体2:黑暗森林>里写到:   真的很难,你冬眠后不久 ...

  9. MQTT-CN MQTT协议中文版

    欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/liangjingyang 项目地址:https://github.com/liangjingyang/MQTT-C ...

  10. Office Add-In 应用类型及平台支持

    原文地址: http://simpeng.net/office-add-in/office-add-in-%e5%ba%94%e7%94%a8%e7%b1%bb%e5%9e%8b%e5%8f%8a%e ...