【题解】洛谷P2296 [NOIP2014TG] 寻找道路(SPFA+DFS)
题目来源:洛谷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)的更多相关文章
- [洛谷P2296] NOIP2014 寻找道路
问题描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- 洛谷 P2296 【寻找道路】
这道题真的很女少啊 言归正传: 这道题其实就是考验的思路,读题后,我们发现对于某个点他所连接的点必须连接终点,那么我们直接反向存图,从终点进行bfs,可以找到未连接的点,然后对这些点所连接的点进行标记 ...
- 【洛谷P2296】寻找道路
反正图两边bfs #include<iostream> #include<cstdio> #include<queue> using namespace std; ...
- 洛谷P1462 通往奥格瑞玛的道路(SPFA+二分答案)
题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...
- 题解 洛谷 P3639 【[APIO2013]道路费用 】
不难想到可以\(2^k\)去枚举\(k\)条新边的选择方案,然后加入原图中的边来使图连通,用当前方案的收益去更新答案,但是这样复杂度过不去. 可以先把\(k\)条新边都连上,然后再加入边权从小到大排序 ...
- 洛谷 题解 P2296 【寻找道路】
Problem P2296 [寻找道路] solution 首先声明,这题我用了spfa,而: 关于spfa:它死了. 杀手: NOI 2018−T1 出题人 感谢出题人,没有卡spfa 用时: 20 ...
- 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)
洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...
- 洛谷P1462-通往奥格瑞玛的道路-二分+最短路
洛谷P1462-通往奥格瑞玛的道路 题目描述 在艾泽拉斯,有\(n\)个城市.编号为\(1,2,3,...,n\). 城市之间有\(m\)条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联 ...
- DP【洛谷P1704】 寻找最优美做题曲线
[洛谷P1704] 寻找最优美做题曲线 题目背景 nodgd是一个喜欢写程序的同学,前不久(好像还是有点久了)洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情, ...
随机推荐
- SQL练习(一)
查找今天过生日的同学 这里表中已经存储了生日,所以思路是取出date_birth去今天的日期相比较 SELECT NAME,date_birth FROM org_mhi_studentfiles W ...
- 希尔排序——Python实现
一.排序思想 希尔排序思想请参见:https://www.cnblogs.com/luomeng/p/10592830.html 二.python实现 def shellSort(arr): &quo ...
- java温故而知新(9)OOP(面向对象编程)理念
Object Oriented Programming (面向对象的程序设计) 1.定义 面向对象程序设计(OOP)的具体定义很难下,也很容易因此而引起争论,在 Object-Orie ...
- 基于easyUI实现权限管理系统(二)——菜单导航
此文章是基于 EasyUI+Knockout实现经典表单的查看.编辑 一. 相关文件介绍 1. menu.jsp:菜单导航主界面 <!DOCTYPE html PUBLIC "-//W ...
- JRebel&XRebel
介绍==>>>> JRebel&XRebel官网 https://zeroturnaround.com/HotSwap和JRebel原理 http://www.holl ...
- easyui grid 增加合计行
一.首先,easyui grid 的 showfooter 属性设置为 true $aplgrid.datagrid({ data: globalExpenseClaimForm.ExpenseCl ...
- Windows系统中Oracle11g R2 版本数据库卸载
1. 停止"服务"中所有的ORCLE服务. 进入服务的方法很多,如: (1)在运行中输入services.msc,然后找到所有跟oracle 有关的服务. (2)开始->设置 ...
- java Date中方法toLocaleString过时的替代方案
DateFormat ddf = DateFormat.getDateInstance(); DateFormat dtf = DateFormat.getTimeInstance(); DateFo ...
- 【Leetcode】【Medium】Construct Binary Tree from Inorder and Postorder Traversal
Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- window 服务注册、卸载
1.以管理员身份打开 命令窗口 2.服务注册命令:sc create myServer binpath= path 3.服务卸载命令:sc delete myServer Topshelf 服务安装 ...