题目来源:洛谷P2296

思路

一开始看还以为是一道水题 虽然本来就挺水的

本道题的难点在于如何判断是否路径上的点都会直接或者间接连着终点

我们需要在一开始多建一个反向图

然后从终点DFS回去 把路径上的点标记

DFS完之后遍历所有的点 如果当前点没有被标记 说明其不会直接或者间接连着终点

那么我们只需要把没有被标记的点在反向图中到达的点(也就是正向图中到达这个点的前一个点)标记为不计算在图内

PS:这里的标记数组要另外再建一个 如果直接改前面的数组会因为没有更新完就修改而多删除有用的点

这样我们就把所有的不需要遍历的点删除了

最后就是SPFA解决

代码

#include<iostream>
#include<queue>
using namespace std;
#define maxn 100010
queue <int> q;
int n,m,cnt2,cnt1,t,w,start,end;
int h1[maxn],h2[maxn],dis[maxn];
bool f[maxn],vis[maxn],vis1[maxn];//f为spfa的判断 vis为反向图的判断 vis1删除点的判断
struct Edge
{
int to;
int next;
}e1[maxn*],e2[maxn*];
void add1(int u,int v)
{
e1[++cnt1].to=v;
e1[cnt1].next=h1[u];
h1[u]=cnt1;
}
void add2(int u,int v)
{
e2[++cnt2].to=v;
e2[cnt2].next=h2[u];
h2[u]=cnt2;
}
void dfs(int u)
{
vis[u]=;
for(int i=h2[u];i;i=e2[i].next)
{
int v=e2[i].to;
if(!vis[v]) dfs(v);
}
}
void spfa()//常规spfa
{
for(int i=;i<=n;i++) dis[i]=1e9+;
q.push(start);
f[start]=;
dis[start]=;
while(!q.empty())
{
int temp=q.front();
q.pop();
f[temp]=;
if(!vis[temp]) continue;
for(int i=h1[temp];i;i=e1[i].next)
{
int v=e1[i].to;
if(dis[v]>dis[temp]+)
{
dis[v]=dis[temp]+;
if(!f[v])
{
f[v]=;
q.push(v);
}
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=;i<=m;i++)
{
int x,y;
cin>>x>>y;
add1(x,y);//正向图
add2(y,x);//反向图
}
cin>>start>>end;
dfs(end);//从终点DFS
for(int i=;i<=n;i++)//把不用的点删去
{
if(!vis[i])
for(int j=h2[i];j;j=e2[j].next)
{
int v=e2[j].to;
vis1[v]=;//更改新建的数组
}
}
for(int i=;i<=n;i++)
if(vis1[i]==) vis[i]=;//更改不用遍历的点
spfa();
if(dis[end]==1e9+)
cout<<-;
else
cout<<dis[end];
}

【题解】洛谷P2296 [NOIP2014TG] 寻找道路(SPFA+DFS)的更多相关文章

  1. [洛谷P2296] NOIP2014 寻找道路

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

  2. 洛谷 P2296 【寻找道路】

    这道题真的很女少啊 言归正传: 这道题其实就是考验的思路,读题后,我们发现对于某个点他所连接的点必须连接终点,那么我们直接反向存图,从终点进行bfs,可以找到未连接的点,然后对这些点所连接的点进行标记 ...

  3. 【洛谷P2296】寻找道路

    反正图两边bfs #include<iostream> #include<cstdio> #include<queue> using namespace std; ...

  4. 洛谷P1462 通往奥格瑞玛的道路(SPFA+二分答案)

    题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...

  5. 题解 洛谷 P3639 【[APIO2013]道路费用 】

    不难想到可以\(2^k\)去枚举\(k\)条新边的选择方案,然后加入原图中的边来使图连通,用当前方案的收益去更新答案,但是这样复杂度过不去. 可以先把\(k\)条新边都连上,然后再加入边权从小到大排序 ...

  6. 洛谷 题解 P2296 【寻找道路】

    Problem P2296 [寻找道路] solution 首先声明,这题我用了spfa,而: 关于spfa:它死了. 杀手: NOI 2018−T1 出题人 感谢出题人,没有卡spfa 用时: 20 ...

  7. 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)

    洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...

  8. 洛谷P1462-通往奥格瑞玛的道路-二分+最短路

    洛谷P1462-通往奥格瑞玛的道路 题目描述 在艾泽拉斯,有\(n\)个城市.编号为\(1,2,3,...,n\). 城市之间有\(m\)条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联 ...

  9. DP【洛谷P1704】 寻找最优美做题曲线

    [洛谷P1704] 寻找最优美做题曲线 题目背景 nodgd是一个喜欢写程序的同学,前不久(好像还是有点久了)洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情, ...

随机推荐

  1. ps命令详解加例子

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  2. Java类加载器ClassLoader总结

    JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中. 2.显式装载, 通过class.forname()等方法,显 ...

  3. mysql根据时间查询日期的优化

    例如查询昨日新注册用户,写法有如下两种: EXPLAIN select * from chess_user u where DATE_FORMAT(u.register_time,'%Y-%m-%d' ...

  4. 2-4 Sass的函数功能-颜色函数

    RGB颜色函数-RGB()颜色函数 在 Sass 的官方文档中,列出了 Sass 的颜色函数清单,从大的方面主要分为 RGB , HSL 和 Opacity 三大函数,当然其还包括一些其他的颜色函数, ...

  5. create-react-app找不到配置项

    npm run eject 这个一个不可逆过程,一旦你执行了,就不能回到初始化

  6. Maven 安装与使用(一)

    1. 安装 参考:http://maven.apache.org/install.html A. win7环境下,官网下载maven安装文件 B. 解压缩maven文件 C. 确认已配置好JAVA环境 ...

  7. nginx 应用包编译及常用文件配置

    1.zlib wget http://www.zlib.net/fossils/zlib-1.2.8.tar.gz 2.openssl wget http://www.openssl.org/sour ...

  8. mac和windows自动清理内存工具

    因为我比较懒,所以需要一款能自动清理电脑内存的工具,目的是设置内存最小值,然后自动清理. mac: drcleaner windows: MaxMem win10设置开机启动地址:C:\Program ...

  9. What’s the difference between a stack and a heap?

    http://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/ The ...

  10. Oracle数据库从入门到精通 单行函数问题

    视频课程:李兴华 Oracle从入门到精通视频课程 学习者:阳光罗诺 视频来源:51CTO学院 Oracle数据库从入门到精通-单行函数 在数据库中,为了方便用户的数据开发,往往会提供一系列的支持函数 ...