题目来源:洛谷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. Servlet开发(一)

    1. Servlet简介 Servlet是服务器端程序,主要用来交互式地浏览和修改数据,生成动态web内容.Servlet是SUN公司提供的一个接口,广义的Servlet可以指任何实现了Servlet ...

  2. Java 方法重载和多态

    先来看看什么是方法重载? 方法重载的要求是:方法名相同,参数列表不同(不同的参数类型或者参数顺序或者参数个数).至于方法的其他部分,如方法返回值类型和修饰符,与方法重载没有任何关系.最好加上@Over ...

  3. Java 线程--实现java.lang.Runnable接口实现线程

    Java线程的第一种实现方式,主要分两步,第一步是继承java.lang.Thread; 第二步是重写run()方法.接下来我们来看Java线程的第二种实现方式,也是分为两步,第一步,写一个类实现ja ...

  4. MyBaits_查询缓存02_Ehcache二级缓存

    一.Ehcache二级缓存的开启 导入jar(https://github.com/mybatis/ehcache-cache/releases) <cache type="org.m ...

  5. MySQL在DOS界面对database和table增删改查

    昨天新接触MySQL,学习了一些内容,今天过来复习一下.(吐槽一下:安装个MySQL耗费老子半天时间!!) 学习了一下,大概知道了对数据库基本的增删改查,增add,删drop,改alter,查show ...

  6. 准备Activiti开发环境

    1.添加jar包 在activiti-5.13 -> wars 目录下 解压 activiti-rest.war ,导入WEB-INF\lib下所有包添加到classpath中. 由于使用的是O ...

  7. springmvc封装list个数限制问题

    提交一颗树,三级区域个数大于1000个导致提交失败!!! org.springframework.beans.InvalidPropertyException: Invalid property 'd ...

  8. Android 触发Button按钮事件的三种方式

    1.新创建一个类 2.使用内部类 3.当多个button按钮时,为简化代码而创建的实例listener 贴代码: MainActivity.Java  文件: package com.android. ...

  9. SQLServer中取当前年,月,日,时,分,秒

    Select GETDATE() as '当前日期',DateName(year,GetDate()) as '年',DateName(month,GetDate()) as '月',DateName ...

  10. Python爬虫教程-19-数据提取-正则表达式(re)

    本篇主页内容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,贪婪与非贪婪模式 Python爬虫教程-19-数据提取-正则表达式(re) 正则表达式 ...