E - Escape from the Island

大佬题解,码风真的爱了

状态表式:f(u,j)f(u,j)f(u,j)当前在uuu点,已经划了jjj步时离终点的最短距离
状态转移:
主动划一步min,转移到下一个点vvv
f(u,j)=f(v,j+1)+1,(u,v)∈E,(u,v)∈Ef(u,j)=f(v,j+1)+1,(u,v)\in E,(u,v)\in Ef(u,j)=f(v,j+1)+1,(u,v)∈E,(u,v)∈E
顺着水流漂max,转移到下一个点vvv
f(u,j)=f(v,0)+1,(u,v)∈Ef(u,j)=f(v,0)+1,(u,v)\in Ef(u,j)=f(v,0)+1,(u,v)∈E

由于我们知道最终点的状态即f(n,j)=0f(n,j)=0f(n,j)=0于是考虑bfs倒着进行更新
主动划一步:(v,j+1)→(u,j)(v,j+1)\to(u,j)(v,j+1)→(u,j)
顺水漂一步:(v,0)→(u,j)(v,0)\to(u,j)(v,0)→(u,j)

非常dt就是顺水飘是最长路更新,而bfs是最短路更新,
比如从(u,j)→(v1,0),(v2,0)…(vk,0)(u,j)\to(v_1,0),(v_2,0)\dots(v_k,0)(u,j)→(v1​,0),(v2​,0)…(vk​,0)划了一步,在bfs过程中会始终让离终点最近的点先出队,不妨设出队顺序为(v1,0),(v2,0)…(vk,0)(v_1,0),(v_2,0)\dots(v_k,0)(v1​,0),(v2​,0)…(vk​,0)即默认f(v1,0)≤f(v2,0)≤⋯≤f(vk,0)f(v_1,0)\leq f(v_2,0)\leq \dots \leq f(v_k,0)f(v1​,0)≤f(v2​,0)≤⋯≤f(vk​,0),我们只需要让最后出队的点(vk,0)(v_k,0)(vk​,0)更新(u,j)(u,j)(u,j)即可,也就是记录一下uuu的出度,当出度为0是就是最后的那个一个点,对其进行更新。

对于无出边的情况,我们让其原地更新

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<bitset>
#include<random>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
typedef pair<ll,int> pli;
typedef pair<int,int> pii;
const int N=100010,M=200010;
int h[N],e[M],ne[M],idx;
int d[N];
bool nd[N];
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int f[N][55];
int n,m,k;
void init()
{memset(h,-1,sizeof(int)*(n+1));idx=0;memset(d,0,sizeof(int)*(n+1));memset(nd,0,sizeof(bool)*(n+1));for(int i=1;i<=n;i++)for(int j=0;j<=k;j++)f[i][j]=0x3f3f3f3f;
}
queue<pii> q;
void update(int a,int b,int c,int d)
{if(f[c][d]==0x3f3f3f3f)f[c][d]=f[a][b]+1,q.push({c,d});
}
void bfs()
{for(int i=0;i<=k;i++)f[n][i]=0,q.push({n,i});while(q.size()){auto [u,t]=q.front();q.pop();if(t>0)for(int i=h[u];i!=-1;i=ne[i])update(u,t,e[i],t-1);else{   // t==0for(int i=h[u];i!=-1;i=ne[i]){   //0代表顺着水流 1代表逆这水流if(i%2==0) continue;  //倒着更新需要逆着水流 --d[e[i]];if(!d[e[i]])for(int j=0;j<=k;j++)update(u,t,e[i],j);}if(nd[u])for(int j=0;j<=k;j++)update(u,t,u,j);}}
}
int main()
{IO;int T=1;cin>>T;for(int ca=1;ca<=T;ca++){cin>>n>>m>>k;init();for(int i=1;i<=m;i++){int u,v;cin>>u>>v;add(u,v),add(v,u);++d[u];}for(int i=1;i<=n;i++)if(!d[i]) nd[i]=1;//没有出度bfs();printf("Case #%d:\n",ca);for(int i=1;i<=n;i++)printf("%d\n",(f[i][0]==0x3f3f3f3f?-1:f[i][0]));}return 0;
}

要加油哦~

E - Escape from the Island(最短路+dp)相关推荐

  1. 【牛客 - 370B】Rinne Loves Graph(分层图最短路 或 最短路dp)

    题干: Island 发生了一场暴乱!现在 Rinne 要和 Setsuna 立马到地上世界去. 众所周知:Island 是有一些奇怪的城镇和道路构成的(题目需要,游戏党勿喷),有些城镇之间用双向道路 ...

  2. P1772 [ZJOI2006]物流运输 最短路+DP

    思路:最短路+DP 提交:1次 题解: $f[i]$表示到第$i$天的最小代价,我们可以预先处理出$i,j$两天之间(包括$i,j$)都可通行的最短路的代价记做$s[i][j]$,然后有$f[i]=m ...

  3. 【HYSBZ - 2763 】飞行路线 (分层图最短路,最短路dp)

    题干: Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价 ...

  4. BZOJ 1003 物流运输 最短路+dp

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1003 题目大意: 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才 ...

  5. CodeForces - 1407E Egor in the Republic of Dagestan(最短路+dp)

    题目链接:点击查看 题目大意:给出 n 个点和 m 条边的有向图,每条边的长度为 1 ,有一个属性由 0 或 1 表示,现在需要给每个节点赋值,使得: 如果点 u 的权值为 0 ,则 u 只能走 ( ...

  6. 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP

    [BZOJ1880][Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起 ...

  7. hdu 1142 最短路 + DP

    这题题意好纠结,半天没看懂,后来打完过不了样例,让海峰读题,最后按他的思路打完了,居然在他之前AC,哈哈~ 读懂了题目还是挺简单的,首先求出所有点到终点的最短路,然后DP一下,就能求出路径条数. /* ...

  8. 2020牛客寒假算法基础集训营3——J.牛牛的宝可梦Go【最短路 DP(01背包) 复杂度优化】(附优化分析)

    题目传送门 题目描述 牛牛所在的W市是一个不太大的城市,城市有n个路口以及m条公路,这些双向连通的公路长度均为1,保证你可以从一个城市直接或者间接移动到所有的城市.牛牛在玩宝可梦Go,众所周知呢,这个 ...

  9. Problem C. Increasing Shortest Path【贪心 最短路-DP】

    题意 给一个图,nnn 个点 mmm 条边,qqq 次询问,求从 iii 到 jjj 的走过条数不超过 ccc 的最短路的长度,走路的时候过的边的长度必须是不减的 数据范围:150150150 点,3 ...

最新文章

  1. rsync使用sudo权限
  2. 浮点数存储格式学习:找到非规格数中最大和最小的数
  3. 最短路 poj1125
  4. react实现svg实线、虚线、方形进度条
  5. LiveVideoStack线上分享第三季(九):《街舞》《长安十二时辰》背后的文娱大脑...
  6. zigbee是什么,为什么说它最适合智能家居设备
  7. 科学地花钱:基于端智能的在线红包分配方案
  8. BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇
  9. 基于情感词典的python情感分析
  10. 用Python玩转数据(一)
  11. 驱动开发笔记3—SSDT表详解
  12. C#求解一元二次方程的根
  13. oracle 10g xe 12505,ORACLE10g的ORA-12505问题解决方法
  14. MySQL创建数据表的三种方式
  15. [windows]远程桌面用户管理
  16. 2010年10月20日
  17. 央视影音大屏版apk下载_央视影音TV版
  18. PHP基本语法--php基础最详细教程
  19. 小米5无线显示如何连接到服务器,小米电视无线显示怎么用?详细操作方法
  20. NanoPC-T4|Android-Q LCD驱动与显示(eDP)

热门文章

  1. cocoscreator editbox 只允许数字_《Cocos Creator游戏实战》做一个数字调节框
  2. android t跳转到fragment,Android 使用EventBus进行Fragment和Activity通信
  3. vue 插入word模板 项目_10 分钟为你的 vue 项目编写代码文档
  4. 浅谈Web前端安全策略xss和csrf,及又该如何预防?
  5. [SpringBoot2]web场景_静态资源规则与定制化
  6. [mybatis]动态sql_sql_抽取可重用的sql片段
  7. C++string容器应用举例
  8. Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))
  9. word List 33
  10. P3355 骑士共存问题(网络流)