我竟然一个人敲了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. 从零开始学习 asp.net core 2.1 web api 后端api基础框架(三)-创建Data Transfer Object

    原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(三)-创建Data Transfer Object 版权声明:本文为博主原创文章,未经博主允许不得转载. ht ...

  2. JS正则--非负整数或小数[小数最多精确到小数点后两位]

    function ValidPrice(obj) { s = obj.value; //var reg = /^[0-9]*\.[0-9]{0,2}$/; var reg = /^[0-9]+([.] ...

  3. ORM 集合

    1.EF   https://github.com/aspnet 2.Chloe.ORM http://www.cnblogs.com/so9527/p/5809089.html http://www ...

  4. TidHttpServer 使用示例

    unit Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ...

  5. iOS判断当前时间是否处于某个时间段内

    /** * 判断当前时间是否处于某个时间段内 * * @param startTime 开始时间 * @param expireTime 结束时间 */ - (BOOL)validateWithSta ...

  6. Central Subscriber Model Explained

    原文 http://www.sqlrepl.com/sql-server/central-subscriber-model-explained/ The majority of SQL Server ...

  7. HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容。

    解决方法: 找到目录浏览,打开,点击右边的启用就OK了.

  8. 微信小程序把玩(三十九)navigation API

    原文:微信小程序把玩(三十九)navigation API 演示效果也看到了小程序也就提供这几个处理导航控制.值得注意的是只能同时导航五个页面 主要属性: 导航条一些方法 wx.setNavigati ...

  9. Attention is all you need及其在TTS中的应用Close to Human Quality TTS with Transformer和BERT

    论文地址:Attention is you need 序列编码 深度学习做NLP的方法,基本都是先将句子分词,然后每个词转化为对应的的词向量序列,每个句子都对应的是一个矩阵\(X=(x_1,x_2,. ...

  10. DateTimeToGreenUnix

    @暗夜魔尊 { Unix date conversion support with time-zone detect } function DateTimeToGreenUnix(const AVal ...