[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 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
随机推荐
- django apscheduler在特定时间执行一次任务(run at a specify time only once)
如何使程序在特定时间只执行一次,我查了一下. celery可以,时间以秒计. task = mytask.apply_async(args=[10, 20], countdown=60) 不过,我 ...
- SQL SERVER-创建Alwayson
Failover Custer(AlwaysOn) 创建Failover Cluster和启动AlwaysOn 创建Failover Cluster 节点的个数要是奇数如果是偶数则要加一个仲裁磁盘.在 ...
- Postgres中文分词
环境 CentOS Linux release 7.2.1511 (Core) 安装Postgres 安装postgres很简单 yum安装 sudo yum install postgresql-s ...
- Java基础系列--03_Java中的方法描述
方法 (1)方法的定义:就是完成特定功能的代码块. 注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法. (2)格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2 ...
- windows 10 防火墙设置规则:允许特定ip端口
本例中以如何设置ip为10.242.62.239的电脑通过3306端口访问我的电脑 为例 1, 打开防火墙高级设置,如图所示,操作如下 入站规则->新建规则->自定义->下一步 2, ...
- python day05
数字类型 1.整型:整数 num = 1000000000000 type(num) --->int 2.浮点型:小数 num = 123.2341 type(num) --->float ...
- nginx正向代理和反正代理区别
1)正向代理:客户端 <一> 代理 一>服务端 客户端访问不到服务端,所以找了代理,由代理帮忙访问到了服务端 2)反向代理:客户端 一>代理 <一> 服务端 客户端 ...
- weblogic补丁下载与安装补丁的方法
文章目录1.根据漏洞报告下载补丁2.补丁包上传解压到Linux3.关于OPatch4.安装补丁4.1单个补丁安装4.2查看已安装的补丁4.3多个补丁安装4.4单个补丁回滚4.5多个补丁回滚4.6验证补 ...
- LOJ #6042. 「雅礼集训 2017 Day7」跳蚤王国的宰相
我可以大喊一声这就是个思博题吗? 首先如果你能快速把握题目的意思后,就会发现题目就是让你求出每个点要成为树的重心至少要嫁接多少边 先说一个显然的结论,重心的答案为\(0\)(废话) 然后我们考虑贪心处 ...
- ASP.NET Core 2.2 : 十七.Action的执行(Endpoint.RequestDelegate后面的故事)
上一章介绍了经过路由的处理,一个请求找到了具体处理这个请求的EndPoint,并最终执行它的RequestDelegate方法来处理这个Httpcontext.本章继续这个处理进程,按照惯例,依然通过 ...