博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu P4822 [BJWC2012]冻结
阅读量:5234 次
发布时间:2019-06-14

本文共 1396 字,大约阅读时间需要 4 分钟。

分层图跑最短路。

但是自己还是太不熟练,没看出来。

太弱了。

对于「选择不多于K条路径并将其长度减半」,实际上可以视为:对于一条路径 $ (u,v) $ ,建两条边:一条到达更高一层的v,权值为 $ w/2 $ ;另一条到达同一层的v,权值为 $ w $ 。

可以发现这个路径是层层升高的。

然后,从起点1跑最短路,取所有层的n中的最短路长度的最小值即可。

码:

#include
#include
#include
#include
#include
using namespace std;int n,m,k;int u[500050],v[500050],w[500050],head[500050],nxt[500050],cnt=0;void add(int ui,int vi,int wi){ cnt++; nxt[cnt]=head[ui]; head[ui]=cnt; u[cnt]=ui; v[cnt]=vi; w[cnt]=wi;}int d[500050];void spfa(){ bool inq[500050]; memset(inq,0,sizeof inq); memset(d,0x3f3f,sizeof d); queue
q; d[1]=0; inq[1]=1; q.push(1); while(!q.empty()){ int ui=q.front();q.pop(); for(int i(head[ui]);i;i=nxt[i]){ int vi=v[i],wi=w[i]; if(d[vi]>d[ui]+wi){ d[vi]=d[ui]+wi; if(!inq[vi]){ inq[vi]=1; q.push(vi); } } } }}int main(){ scanf("%d%d%d",&n,&m,&k); for(int i(1);i<=m;i++){ int ui,vi,wi;scanf("%d%d%d",&ui,&vi,&wi); for(int j(0);j<=k-1;j++){ add(ui+j*n,vi+j*n,wi); add(vi+j*n,ui+j*n,wi); add(ui+j*n,vi+(j+1)*n,wi/2); add(vi+j*n,ui+(j+1)*n,wi/2); } add(ui+k*n,vi+k*n,wi); add(vi+k*n,ui+k*n,wi); } spfa(); int ans=d[n]; for(int i(2);i<=k+1;i++)ans=min(ans,d[n*i]); printf("%d",ans); return 0;}

这里有一点要注意,最后检查每一层n的时候,对应的编号是 $ n,n+n,n+2n,n+3n,......n+kn $

所以最后枚举要到k+1

转载于:https://www.cnblogs.com/soul-M/p/9588106.html

你可能感兴趣的文章
S-HR之变动操作,变动原因,变动类型/离职操作,离职原因,离职类型
查看>>
拆分字符串
查看>>
jq的each和map遍历
查看>>
js--script和link中的 integrity 属性
查看>>
xss攻击
查看>>
HTML DOM querySelector() 方法
查看>>
??条件判断
查看>>
千万不要误以为1个server只允许连接65535个Client。记住,TCP连出受端口限制,连入仅受内存限制...
查看>>
novalidate
查看>>
label for标签的作用
查看>>
uml多重性
查看>>
fastjson @JsonField
查看>>
jvm配置
查看>>
重载类型运算符
查看>>
EasyUI学习-如何使用jQuery EasyUI?
查看>>
前端JS之HTML利用XMLHttpRequest()和FormData()进行大文件分段上传
查看>>
jQuery获取Select选择的Text和 Value
查看>>
hdu1525 Euclid&#39;s Game , 基础博弈
查看>>
UVA 1262 Password 暴力枚举
查看>>
CakePHP不支持path/to路径,前后台无法方法
查看>>