隐藏页面特效

[[BJWC2012] 冻结]

1|0[BJWC2012] 冻结


1|1题目大意


在能有k次机会使得某些道路变为其12长度的情况下,求1n的最短路

1|2做法


其实就是分层最短路的模板题,有k次机会减少,那么对于一个点来说就有可能是在这前使用了0~k次减少的机会到达的,每个点都有k个分身,故要建k+1个层,建好之后直接跑最短路,最后"n"点有k+1个,要遍历n及它的k个分身就能得到答案

1|3注意


每个点相当于变成了k+1个点,那么关于结点个数的数组至少要开到50×51=2050,边个数的数组要开到1000×(50×2+51×2)=202000

洛谷P4822

#include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 3005; int n,m,k,dis[maxn]; int cnt,head[maxn]; bool vis[maxn]; struct Edge{ int to,len,next; }edge[202001]; struct node{ int id,dist; bool operator < (const node &x) const { return dist > x.dist; } }; priority_queue <node> q; inline void add(int u,int v,int w) { cnt ++; edge[cnt].to = v; edge[cnt].len = w; edge[cnt].next = head[u]; head[u] = cnt; return ; } int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); for(int j=0;j<=k;j++) { add(j*n+u,j*n+v,w);//保持每层u和v的相连 add(j*n+v,j*n+u,w); } for(int j=0;j<k;j++) { add(j*n+u,(j+1)*n+v,w/2);//第j层的u向第j+1层的v连接,就是使用了一次 add(j*n+v,(j+1)*n+u,w/2);//同理j层v向j+1层u连接 } } memset(dis,127,sizeof(dis)); dis[1] = 0;q.push((node){1,0}); while(!q.empty()) { node M = q.top(); q.pop(); int u = M.id; if(vis[u]) continue; vis[u] = 1; for(int i=head[u];i;i=edge[i].next) { int v = edge[i].to; if(dis[v] > dis[u] + edge[i].len) { dis[v] = dis[u] + edge[i].len; q.push((node){v,dis[v]}); } } } int ans = 2147483647; for(int i=k;i>=0;i--) ans = min(ans,dis[i*n+n]); printf("%d",ans); return 0; }

__EOF__

本文作者风丨铃
本文链接https://www.cnblogs.com/-Wind-/p/18306174.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   风丨铃  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示