[Luogu P2296][NOIP 2014]寻找道路
emmm交了第8次才过。
这道题目测一道单源最短路问题,因此dijkstra或者spfa板子先准备好。因为题中对最短路有限定:
- 路径上的所有点的出边所指向的点都直接或间接与终点连通。
- 在满足条件1的情况下使路径最短。
而题中还说“题目保证终点没有出边。”,所以我们考虑反向处理,也就是说最短路径上的点一定在以终点为根的搜索树上,并且这些点的所有出边一定也在这棵树上。所以考虑dfs/bfs搜索图,标记所有搜过的点,然后枚举每个标记点的出边所指向的点,如果不在树上则删除标记。这里有一个坑点,如果直接对标记进行修改,由于树上的编号和搜索顺序没有关系,会导致改标记的时候把没扫到的点也改掉了,从而造成删掉不该删掉的点,因此考虑备份标记即可。
然后我错这么多次的原因,说起来非常水,原因是在spfa的时候没有对入队的元素标记,数据大的时候入队多次直接爆空间,只有第一个点数据小能水10分QAQ
参考代码:
#include<iostream>
#include<cstdio>
#include<queue>
#define N 10010
#define M 200010
#define inf 1e8
using namespace std;
queue<int>q;
int nxt[M],to[M],fnxt[M],fto[M];
int n,m,in_q[N],head[N],vis[N],fhead[N],fcnt,cnt,visited[N],dis[N],s,t;
void dfs(int x)
{
visited[x] = ;
for(int i = fhead[x];i;i = fnxt[i])
{
if(!visited[fto[i]]) dfs(fto[i]);
}
}
void spfa()
{
for(int i = ;i <= n;i++) dis[i] = inf;
in_q[s] = ;
dis[s] = ;
q.push(s);
int u;
while(!q.empty())
{
u = q.front();
q.pop();
in_q[u] = ;
if(!visited[u]) continue;
for(int i = head[u];i;i = nxt[i])
{
if(dis[to[i]] > dis[u] + )
{
dis[to[i]] = dis[u] + ;
if(!in_q[to[i]])
{
in_q[to[i]] = ;
q.push(to[i]);
}
}
}
}
}
void del()
{
for(int i = ;i <= n;i++) vis[i] = visited[i];
for(int i = ;i <= n;i++)
{
if(!vis[i])
{
for(int j = fhead[i];j;j = fnxt[j])
{
if(vis[fto[j]]) visited[fto[j]] = ;
}
}
}
} void add(int u,int v,int k)
{
if(k == )
{
to[++cnt] = v;
nxt[cnt] = head[u];
head[u] = cnt;
}
else
{
fto[++fcnt] = v;
fnxt[fcnt] = fhead[u];
fhead[u] = fcnt;
}
return;
}
int main()
{
scanf("%d %d",&n,&m);
int u,v;
for (int i = ;i <= m;i++)
{
scanf("%d %d",&u,&v);
add(u,v,);
add(v,u,); }
scanf("%d %d",&s,&t);
dfs(t);
del();
spfa();
printf("%d",(dis[t] >= inf) ? - : dis[t]);
}
[Luogu P2296][NOIP 2014]寻找道路的更多相关文章
- NOIp 2014 寻找道路【图的遍历/最短路】By cellur925
题目传送门 比较裸的图论,结果自己还是没做出来,我真菜. 我们根据题意,只要把不能通向终点的点求出,然后再分别以这些点为起点,求出它们能到达的点,这些点也不能在路径上. 之后跑一个最短路即可. 注意以 ...
- [NOIP 2014] 寻找道路
[题目链接] http://uoj.ac/problem/19 [算法] 首先,在反向图上从终点广搜,求出每个点是否可以在答案路径中 然后在正向图中求出源点至终点的最短路,同样可以使用广搜 时间复杂度 ...
- Luogu 1351 NOIP 2014 联合权值(贪心,计数原理)
Luogu 1351 NOIP 2014 联合权值(贪心,计数原理) Description 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi, ...
- 【洛谷P2296】[NOIP2014]寻找道路
寻找道路 题目链接 这道题非常的水,按照题意, 先反向建边,从终点搜索,标记出可以到达终点的点 然后枚举一遍,判断出符合条件1的点 再从起点搜索一遍就可以了 #include<iostream& ...
- niop 2014寻找道路
/* 乍一看就是个最短路 SFPA 但是要保证路径上的所有点的出边所指向的点都直接或间接与终点连通. 这一点就蛋疼了0.0 开始想的是正着跑一边 每一个点的所有边都能符合条件 那这个点就符合条件0.0 ...
- Codevs 3731 寻找道路 2014年 NOIP全国联赛提高组
3731 寻找道路 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在有向图G中,每条边的长度均为1,现给定起点和终点,请你在图中找 ...
- luogu 2296 寻找道路 (搜索)
luogu 2296 寻找道路 题目链接:https://www.luogu.org/problemnew/show/P2296 从终点bfs或者dfs,找出所有终点能到达的点. 然后再从1到n看一下 ...
- 洛谷P2296 寻找道路==codevs3731 寻找道路
P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- 洛谷——P2296 寻找道路
P2296 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
随机推荐
- Rx响应式编程
RX响应式编程就是异步数据流编程:单击事件或事件总线;(观察者模式) 有一堆的函数能够创建流,也能将任何流-,也能将任何流进行组合和过滤.一个流能够作为另一个流的输入,能够将两个流合并,可以通过过滤流 ...
- js清空数组的方法
方式1:splice函数 arrayObject.splice(index,howmany,element1,.....,elementX) index:必选,规定从何处添加/删除元素. howman ...
- 将对象xml序列化和反序列化
//将一个对象按XML序列化的方式写入到一个文件,使用的默认的UTF8编码格式 //o为要序列化的对象 //path保存文件的路径 public static object _lockObj=new ...
- vtop工具使用分析
vtop工具可以为esxtop提供图形界面,并且可以显示实时统计数据,对于我们监控esxi主机的需求匹配度很高,同时,相对于vcenter中的数据统计选项实时性更高,操作简便,可作为工作使用 为便于我 ...
- windows本地远程虚拟机docker中的数据的问题
关闭各种防火墙 打开宿主机(windows)的cmd,在其中添加通往192.168.1.0/24网络的路由. 通往192.168.1.0/24网络的数据包由172.20.1.12来转发 route a ...
- MongoDB-BSON
概念参考百科说明:BSON( Binary Serialized Document Format) 是一种二进制形式的存储格式,采用了类似于 C 语言结构体的名称.对表示方法,支持内嵌的文档对象和数组 ...
- Unity3D介绍
Unity3D介绍:Unity3D是一个游戏开发引擎 由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具 ...
- HTML基础知识个人总结
[学习的网站是主要是W3school,还加上一些其他搜索学习到的内容,仅在博客做个人整理] 一.标签——尖括号围成的关键词,成对出现. ※使用时必须符合标签嵌套规则 1. (1) <!DOCTY ...
- servlet(6) 链接数据库
一.servlet链接mysql步骤: 1.注册驱动器:Class.forName("com.mysql.jdbc.Driver"); 加载类并执行下面的静态语句块,将Driver ...
- Laravel数据库迁移
Laravel的数据迁移功能很好用,并且可以带来一系列好处.通过几条简单的 artisan 命令,就可以顺利上手,没有复杂的地方 注意:该系列命令对数据库非常危险,请准备一个单独的数据库作为配套练习, ...