ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分层图跑最短路:适用于可以对一定数量的前k条边权可以免费 减半的时候 omk的空间

2022-08-24 01:03:43  阅读:153  来源: 互联网

标签:下层 omk 图跑 条边权 edge 层图 免费 上层 dis


下层到上层的边不用建 从上层到下层就已经代表了做了一次选择 如果还能回到上层的话会出问题的
因为可以免费 k 次,所以我们要建 k+1 层图
在 k+1 层图上我们已经不能再往下了,即免费操作已用完

    for(int i=1,x,y,z;i<=p;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add(y,x,z);    //本层建边
        for(int j=1,z1=0;j<=k;j++)//z1是前k条边可以跑的边权
        {
            add(x+(j-1)*n,y+j*n,z1);    //第j层和第j+1层间的建边 第j层的y到第j层的y+1
            add(y+(j-1)*n,x+j*n,z1);//第j层x 到 第j+1层的y
            add(x+j*n,y+j*n,z);
            add(y+j*n,x+j*n,z);    //第j+1层建边
        }
    }
    //求答案法一 每一层的终点向下一层的终点连边保证第k层的终点就是答案
    for(int i=1,z=0;i<=k;i++)
        add(i*n,(i+1)*n,z);//防止可以免费的边大于1-n的路径这种情况 这样保证
    res = dis[(k+1)*n];

    //求答案法二 的时候 第一层到第k+1层
    for(int i=0,i<=k,i++){
        an=min(an,dis[t+i*n]);//k次操作内的最短路
    }

求第k+1条贵的长度https://www.acwing.com/problem/content/description/342/

现在我们要这么更新:
z=max(edge,dis[x]); //edge是当前边权值
if ( dis[y] > z ) dis[y] = z;


标签:下层,omk,图跑,条边权,edge,层图,免费,上层,dis
来源: https://www.cnblogs.com/liang302/p/16618388.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有