[NOIp2014] luogu P2296 寻找道路
不知道是因为我菜还是别的,最近老是看错题。
题目描述
在有向图 GGG 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:
- 路径上的所有点的出边所指向的点都直接或间接与终点连通。
- 在满足条件 1 的情况下使路径最短。
注意:图 GGG 中可能存在重边和自环,题目保证终点没有出边。
请你输出符合条件的路径的长度。
Solution
- 定义一个点是黑点,当且仅当它能沿着边走到终点(不需满足题设条件);
- 定义一个点是YH点,当且仅当它引出的边指向的点都是黑点(起点终点都是YH点);
- 删去所有非YH点,跑 SPFA 即可。
注意反向建图
#include<cstdio>
#include<cstdlib>
#include<cstring>
const int MAXN=10010;
const int MAXM=200010;
struct node{
int x,y,next;
}e[MAXM];
int len=0;
int first[MAXN];
int n,m;
int sx,sy;
bool dis[MAXN];
int ST,ED;
int st,ed;
int q[MAXM*10];
int f[MAXN],v[MAXN];
void ins(int x,int y){
e[++len].x=x;e[len].y=y;
e[len].next=first[x];first[x]=len;
}
void init(){
memset(dis,1,sizeof(dis));dis[ED]=0;
st=1;ed=2;q[1]=ED;
while(st!=ed){
int x=q[st];
for(int i=first[x];i;i=e[i].next){
int y=e[i].y;
if(!dis[y]) continue;
dis[y]=0;
q[ed++]=y;
}
++st;
}
if(dis[ST]){
puts("-1");
exit(0);
}
bool rework[MAXN];
memset(rework,0,sizeof(rework));
for(int i=1;i<=n;++i)
if(dis[i]){
rework[i]=1;
for(int j=first[i];j;j=e[j].next)
rework[e[j].y]=1;
}
for(int i=1;i<=n;++i)
dis[i]=rework[i];
}
void spfa(){
memset(f,63,sizeof(f));f[ED]=0;
memset(v,0,sizeof(v));v[ED]=1;
st=1;ed=2;q[1]=ED;
while(st!=ed){
int x=q[st];
for(int i=first[x];i;i=e[i].next){
int y=e[i].y;
if(dis[y]) continue;
if(f[y]>f[x]+1){
f[y]=f[x]+1;
if(!v[y]){
v[y]=1;
q[ed++]=y;
}
}
}
++st;v[st]=0;
}
}
inline int read(){
int x=0; char c;
do c=getchar(); while(c<'0'||c>'9');
while(c>='0'&&c<='9')
x=x*10+c-48,c=getchar();
return x;
}
int main(){
n=read();m=read();
for(int i=1;i<=m;++i){
sx=read();sy=read();
ins(sy,sx);
}
ST=read();ED=read();
init();
spfa();
printf("%d",f[ST]);
}
[NOIp2014] luogu P2296 寻找道路的更多相关文章
- 【luogu P2296 寻找道路】 题解
题目链接:https://www.luogu.org/problemnew/show/P2296 题意:给定起点终点,找一条从起点到终点的最短路径使路上的每个点都能有路径到达终点. 我们先反着建一遍图 ...
- luogu P2296 寻找道路
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- luogu P2296 寻找道路 |最短路
题目描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直接或间接与终点连通. 在满足条件 1 的 ...
- LUOGU P2296 寻找道路 (noip 2014)
传送门 解题思路 首先建一张反图,从终点dfs出哪个点直接或间接相连,然后直接跑最短路,跑的时候判断一下所连的点是否与终点相连. 代码 #include<iostream> #includ ...
- 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 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- 洛谷P2296 寻找道路 [拓扑排序,最短路]
题目传送门 寻找道路 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...
- NOIP2014 day2 t2 寻找道路
寻找道路 NOIP2014 day2 t2 描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点的路径,该路径满足以下条件: 1.路径上的所有点的出边所指向的 ...
随机推荐
- graphics.drawRect()方法
drawRect方法的官方API文档描述 drawRect public void drawRect(int x, int y, int width, int height) Draws the ou ...
- maven的使用解说
maven周期及项目中的应用: 周期如下: 1.default生命周期,部署项目(jar包的依赖管理) 2.clear生命周期,项目清理工作 3.site生命周期,处理项目中产生的文档信息 应用: 1 ...
- Maven 梳理 -目录结构
Maven项目的目录约定 MavenProjectRoot(项目根目录) |----src | |----main | | |----java ——存放项目的.java文件 | | |----reso ...
- mysql5.7初始密码及设置问题
为了加强安全性,MySQL5.7为root用户随机生成了一个密码,如果安装的是RPM包,则默认是在/var/log/mysqld.log中. 可通过# grep "password" ...
- C语言I—2019秋作业02
1.[新增内容] 这个作业属于那个课程 C语言程序设计 这个作业要求在哪里 <C语言I-2019秋作业02> 我在这个课程的目标是 这个作业在那个具体方面帮助我实现目标 <实现一些基 ...
- 正睿OI DAY3 杂题选讲
正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...
- Vagrant定制个性化CentOS7虚拟机模板
关于虚拟机模板 想用vagrant搭建hadoop集群,要完成以下准备工作: 三个虚拟机实例操作系统都是CentOS7的server版: 每个实例都要安装同样的应用.关闭防火墙.关闭swap等: 今天 ...
- vue-cli 脚手架安装
1.安装node;选择适合自己系统的文件,下载一路next , a安装成功后,打开运行输入cmd 进入命令行: 在命令行工具中输入 npm -v 检查版本号 如果出现 则安装成功:(npm为node ...
- Openshift yum安装
Openshift yum安装: Yum 安装docker [root@DockerServer openshift]# yum repolist [root@DockerServer openshi ...
- scalikejdbc 学习笔记(1)
build.sbt: import sbt._ import Process._ import Keys._ EclipseKeys.createSrc := EclipseCreateSrc.Def ...