题目来源:洛谷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. MySQL的四种事务隔离级别【转】

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...

  2. Java温故而知新(3)异常处理机制

    异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出 ...

  3. jquery点击导航栏选中更换样式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. pv-remjs的快速开始

    pv-remjs 这是一个移动端适配的工具类,采用rem布局的方式 ## 快速开始 在html文件中引入,先查看版本`<script src= "https://unpkg.com/p ...

  5. WebClient用法小结(转载)

    如果只想从特定的URI请求文件,则使用WebClient,它是最简单的.NET类,它只用一两条命令执行基本操作,.NET FRAMEWORK目前支持以http:.https:.ftp:.和 file: ...

  6. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  7. intellij-maven-imports-have-broken-classpath

    公司自己搭得maven私服,然后使用git下载 公司mvn的依赖包时候,报错: 之后再idea里面发现依赖的jar包 有红色的错误信息,提示 maven imports have broken cla ...

  8. 使用spring aop遇到的坑

    1.aop 切点配置无误但只对控制器无效. 检测你的aop开启配置是否放在了spring配置文件中,如果是请把它移到mvc配置文件中. 我们知道当spring项目使用了spring mvc时,项目是存 ...

  9. Log4Net使用教程

    简介 为方便跟踪程序运行情况,我们可以记录系统运行异常日志,winform和web都可以通过继承异常或者try来实现. 官方网站:http://logging.apache.org/log4net/ ...

  10. IIS 无法安装URL重写模块的解决办法 UrlReWrite (.NET`SQL技术交流 群号206656202)

    下载和安装URL Rewrite IIS8默认是没有安装URL重写工具的,必须要自己下载安装. 如果IIS上默认有安装Web平台安装程序,我们可以使用平台自动安装URL Rewrite重写工具,打开I ...