题目

一个有向图,要求满足要求的最短路径,要求为:

路径上的所有点的出边所指向的点都直接或间接与终点连通。

输入1

3 2 (3个点,2条边)
1 2 (1和2之间可以连接)
2 1
1 3 (从1到3)

输出1

-1

输入2

6 6
1 2
1 3
2 6
2 5
4 5
3 4
1 5

输出2

3


解题思路

其实我们就求出满足要求的点,然后在这些点里找最短路,还有本人这里的方法比较复杂和麻烦


代码

#include<cstdio>
using namespace std;
struct woc{int next,x,y;
};//日常邻接表
woc a[200001],lt[200001];
int xx,yy,n,m,k,state[10001],ls[10001],t,head,tail,f[10001],star,over;
int fls[10001];
bool ltfl[10001];
bool v[10001];
void check()//求所有可以直接或间接到终点的边
{int t=0;int head=0;int tail=1;state[1]=over;ltfl[state[1]]=true;//初始化while (head!=tail){head++;head=(head-1)%n+1;t=fls[state[head]];//求边while (t!=0){if (!ltfl[lt[t].y]){tail++;tail=(tail-1)%n+1;state[tail]=lt[t].y;ltfl[lt[t].y]=true;//标记}t=lt[t].next;//求下一条边}}
}
bool ok(int x)//是否满足要求
{int t=ls[x];while (t!=0){if (!ltfl[a[t].y]) return false;t=a[t].next;}return true;
}
int main()
{scanf("%d%d",&n,&m);state[1]=1;int u=0;    for (int i=1;i<=m;i++){scanf("%d",&xx);scanf("%d",&yy);a[++u].next=ls[xx];ls[xx]=u;a[u].x=xx;a[u].y=yy;//边lt[u].next=fls[yy];fls[yy]=u;lt[u].y=xx;lt[u].x=yy;//记录一条回去的边}   scanf("%d%d",&star,&over);for (int i=1;i<=n;i++) f[i]=2147483647;//初始化    check();//求所有可以直接或间接到终点的边head=0;tail=1;state[1]=star;v[state[1]]=true;f[star]=0;//初始化×2while (head!=tail){head++;//出队head=(head-1)%n+1;//循环队列t=ls[state[head]];while (t!=0){if (f[a[t].x]+1<f[a[t].y] && ok(a[t].y))//判断是否满足要求{f[a[t].y]=f[a[t].x]+1;//松弛if (!v[a[t].y]){tail++;//入队tail=(tail-1)%n+1;//循环队列state[tail]=a[t].y;v[a[t].y]=true;}}t=a[t].next;//下一条边}v[state[head]]=false;//解封}if (f[over]==2147483647) printf("-1");//是否有解else printf("%d\n",f[over]);
}

洛谷P2296-寻找道路【日常图论,最短路,SPFA】相关推荐

  1. 洛谷P1346-电车【日常图论,最短路,SPFA】

    题目 一个有向图,每个点有个默认方向和若干个其他方向,走默认方向权值为0,其他方向权值为1,求最短路 输入 3 2 1(3个点,点2到点1) 2 2 3(2个点,起点为1,2为默认点,3为其他点) 2 ...

  2. 洛谷 P2296 寻找道路

    感慨 周五比赛的测试题,结果到比赛结束也没有读懂题意...给的样例太少了,我一直以为我是不是spfa敲错了...没想到中间还有卡的地方 分析 题目中的一句耐人寻味的话"路径上的所有点的出边所 ...

  3. 洛谷2296 寻找道路

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件:  1 .路径上的所有点的出边所指向的点都直接或间接与终点连通.  2 .在满 ...

  4. 洛谷P1119 灾后重建 图论 脑洞题

    洛谷P1119 灾后重建 图论   脑洞题   floyd    floyd中 k 的意义 通过前 k 个点 作为中间的节点 更新 i 到 j 的最短路 也就是 只经过前 k 个点 的最短路 帮助理解 ...

  5. 洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

    洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点 那么说明不符合要求 需要 ...

  6. P2296 寻找道路

    P2296 寻找道路 题目描述 在有向图 \(G\) 中,每条边的长度均为 \(1\) ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直 ...

  7. 【洛谷3043】跳楼机(最短路)

    [洛谷3043]跳楼机(最短路) 题面 洛谷 题解 思路很妙嗷. 先只考虑只用\(y,z\)两种移动方式,它们一定能够到达一些楼层, 那么这些楼层再只用\(x\)拓展就能够计算答案. 那么我们这样子计 ...

  8. 洛谷2505 [HAOI2012]道路(最短路计数)

    洛谷传送门 [题目分析] 线段树?bczd,这么小的范围直接暴力就行啦. 直接O(n)枚举源点,每次跑最短路,然后对于每一条路径统计是否在最短路上.两个端点各有多少条最短路径经过即可. [代码~] # ...

  9. 洛谷:P1524 十字绣(图论中 (出 / 入) 度的应用)

    洛谷:十字绣 我们把格子上的点抽象成图中的节点,同时开一个数组记录它的度(无向图) 我们再把点的贡献定义为:图中一个点通过相连的边得到的度数,也就相当于它贡献出的针数 如果该点与正面的某一条线相连,我 ...

最新文章

  1. 使鼠标保持按住状态_MouseInc 鼠标手势工具
  2. oracle - emctl start dbconsole
  3. 什么是前端开发中的viewport
  4. android 通知垃圾回收,Android中垃圾回收日志信息
  5. 【优化】如何检测移动端 CPU 以及内存占用率
  6. 快捷打开计算机管理设置,Win7系统下怎么设置Ctrl+Alt+Del快捷打开任务管理器【图文】...
  7. 【脚本】去掉win7快捷方式的小箭头
  8. m4s格式转换mp3_mp4怎么转换成mp3格式?mp4转mp3的傻瓜式方法
  9. 终于找到了!AI学习路线图——从零基础到就业
  10. 求三角形面积-gyy
  11. 2020计算机应用基础终结性考试,2019-2020年电大考试《计算机应用基础》形成性考核.docx-文档在线预览...
  12. 关于H5页面在iPhoneX适配(转)
  13. 第十六届全国大学智能车竞赛华东赛区成绩汇总
  14. Dubbo后台管理和监控中心部署
  15. 还在纠结交易系统的细节吗?看这篇文章就够了!
  16. APP - 查询全国医院各科室排行榜(一)
  17. OPENCART之兼容多种浏览器的加入收藏夹扩展功能插件(CROSS-BROWSER BOOKMAR
  18. FPGA驱动千兆以太网PHY但电脑只显示百兆
  19. 写的书太受欢迎怎么办?北大《深度强化学习》作者:那就开放下载吧
  20. 计算机键盘一般分四个区域 其中,四个键盘区域分别在哪里

热门文章

  1. java线程带来的异常,java多线程练习之捕获子线程异常例子
  2. 帆软获取上月的第一天与最后一天_《原神》岩港打工第一天怎么玩 岩港打工第一天玩法攻略...
  3. expsky.php,Typecho漏洞利用工具首发,半分钟完成渗透
  4. java locale.us_JAVA实现国际化
  5. sql计算留存_SQL基础第七讲:关于用户留存率的计算
  6. 软件构造学习笔记-第六周
  7. [C++STL]queue容器用法介绍
  8. [Java基础]抽象类和接口的区别
  9. [蓝桥杯][算法提高VIP]开灯游戏-dfs
  10. 最短路(遍历边)计蒜客—DD坐地铁