<题目链接>

题目大意:

有N个城市,这些城市之间有M条有向边,每条边有权值,能够选择K条边 边权置为0,求1到N的最短距离。

解题分析:

分层图最短路模板题,将该图看成 K+1 层图,然后具体解析见代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define INF 0x7ffffffffff;
;
;
typedef long long ll;

int n,m,k,tot,cnt;
int head[M];
];
struct EDGE{
    int to;
    int next;
    ll val;
}edge[M<<];
struct NODE{
    int loc,cal;  //loc代表该点的标号,cal代表该点所在的层数,这两个变量可以确定分层图中所有点的位置
    ll dist;
    bool operator <(const NODE &tmp)const{
        return dist>tmp.dist;
    }
    NODE(,,ll w=){
        loc=a,cal=b,dist=w;
    }
}d[N][];
void init(){
    cnt=;
    memset(head,-,sizeof(head));
}
void add(int u,int v,int w){
    edge[++cnt].to=v,edge[cnt].val=w;
    edge[cnt].next=head[u],head[u]=cnt;
}
void dij(){
    memset(vis,false,sizeof(vis));
    ;i<=n;i++){
        ;j<=k;j++){
            d[i][j].dist=INF;        //将所有点到起点的距离初始化为无穷大
        }
    }
    d[][].dist=;
    priority_queue<NODE>q;
    q.push(NODE(,,d[][].dist));
    while(!q.empty()){
        NODE now=q.top();
        q.pop();
        int tmp1=now.loc,tmp2=now.cal;
        if(vis[tmp1][tmp2])continue;
        vis[tmp1][tmp2]=true;
        for(int i=head[tmp1];~i;i=edge[i].next){
            int v=edge[i].to;
            ll cost=edge[i].val;
            if(d[v][tmp2].dist>d[tmp1][tmp2].dist+cost){     //在同一层中进行普通的松弛操作,表示当前道路的权值不用置为0
                d[v][tmp2].dist=d[tmp1][tmp2].dist+cost;
                q.push(NODE(v,tmp2,d[v][tmp2].dist));
            }
            <=k&&d[v][tmp2+].dist>d[tmp1][tmp2].dist){  //没有加上cost,代表 tmp1-->v 这段路的权值置为0
                d[v][tmp2+].dist=d[tmp1][tmp2].dist;
                q.push(NODE(v,tmp2+,d[v][tmp2+].dist));
            }
        }
    }
}
int main(){
    int T;scanf("%d",&T);
    while(T--){
        init();
        scanf("%d%d%d",&n,&m,&k);
        ;i<=m;i++){
            int u,v;ll w;
            scanf("%d%d%lld",&u,&v,&w);
            add(u,v,w);
        }
        dij();
        ll mn=INF;
        ;i<=k;i++){          //在所有层中选取最短的情况
            mn=min(mn,d[n][i].dist);
        }
        printf("%lld\n",mn);
    }
    ;
}

2018-09-12

ACM-ICPC 2018 南京赛区网络预赛 L 【分层图最短路】的更多相关文章

  1. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze

    262144K   There are NN cities in the country, and MM directional roads from uu to v(1\le u, v\le n)v ...

  2. ACM-ICPC 2018 南京赛区网络预赛 L题(分层最短路)

    题目链接:https://nanti.jisuanke.com/t/31001 题目大意:给出一个含有n个点m条边的带权有向图,求1号顶点到n号顶点的最短路,可以使<=k条任意边的权值变为0. ...

  3. ACM-ICPC 2018 南京赛区网络预赛 L题(分层图,堆优化)

    题目链接: https://nanti.jisuanke.com/t/31001 超时代码: #include<bits/stdc++.h> using namespace std; # ...

  4. ACM-ICPC 2018 南京赛区网络预赛 L.Magical Girl Haze(分层最短路)

    There are N cities in the country, and M directional roads from u to v(1≤u,v≤n). Every road has a di ...

  5. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze 最短路+分层图

    类似题解 There are NN cities in the country, and MM directional roads from uu to v(1\le u, v\le n)v(1≤u, ...

  6. ACM-ICPC 2018 南京赛区网络预赛 - L Magical Girl Haze (分层迪杰斯特拉)

    题意:N个点,M条带权有向边,求可以免费K条边权值的情况下,从点1到点N的最短路. 分析:K<=10,用dist[i][j]表示从源点出发到点i,免费j条边的最小花费.在迪杰斯特拉的dfs过程中 ...

  7. ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路

    https://nanti.jisuanke.com/t/31001 题意 可以把k条边的权值变为0,求s到t的最短路 解析  分层最短路  我们建立k+1层图 层与层之间边权为0,i 向 i+1层转 ...

  8. 【ACM-ICPC 2018 南京赛区网络预赛 L】Magical Girl Haze

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 定义dis[i][j]表示到达i这个点. 用掉了j次去除边的机会的最短路. dis[1][0]= 0; 在写松弛条件的时候. 如果用 ...

  9. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze (分层dijkstra)

    There are NN cities in the country, and MMdirectional roads from uu to v(1\le u, v\le n)v(1≤u,v≤n). ...

随机推荐

  1. Markdown 简介及基础语法

    一.Markdown 简介 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 二.Markdown 基础语法 1. Markdown ...

  2. Centos 7.3下 Linux For SQL Server安装及配置介绍

    Centos 7.3下 Linux For SQL Server安装及配置介绍 高文龙关注13人评论2828人阅读2017-03-05 21:46:21 Centos 7.3下Linux For SQ ...

  3. 第十四单元 Linux网络原理及基础设置

    ·ifconfig命令来维护网络(详见linux系统管理P422) 1) 掌握ifconfig命令的功能:显示所有正在启动的网卡的详细信息或设定系统中网卡的IP地址.2) 灵活应用ifconfig命令 ...

  4. 20165314 2016-2017-2 《Java程序设计》第7周学习总结

    20165314 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 MySQL数据库管理系统 连接MySQL数据库 JDBC 批处理 代码托管

  5. 论文阅读笔记十:DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs (DeepLabv2)(CVPR2016)

    论文链接:https://arxiv.org/pdf/1606.00915.pdf 摘要 该文主要对基于深度学习的分割任务做了三个贡献,(1)使用空洞卷积来进行上采样来进行密集的预测任务.空洞卷积可以 ...

  6. DDD工作流持久化(十六)

    找到对应的sql文件执行sql语句 产生如下的表: 添加引用: 添加命名空间: using System.Activities.DurableInstancing; using System.Runt ...

  7. jQuery实用工具集

    插件描述:jQuery实用工具集,该插件封装了常用功能,如序列化表单值获取地址栏参数window对象操作等 此工具集包含判断浏览器,判断浏览终端,获取地址栏参数,获取随机数,数据校验等常用操作功能 引 ...

  8. CentOS6 安装gnutls

    所有用的的包:https://pan.baidu.com/s/1EQYf3gsK_xT6kCAjrVs2aQ wget http://download.savannah.gnu.org/release ...

  9. php把一些预定义的 HTML 实体转换为字符。

    htmlspecialchars_decode() echo htmlspecialchars_decode($condition,ENT_QUOTES) '  会被转成 单引号

  10. 【UOJ244】【UER #7】短路

    题解: 感觉贪心水平有所提高.. 首先比较显然的事情是我们可以枚举最深进行到哪一层 我们会发现,当且仅当该层是最小值才会使用决策, 并且是从该层的左上,走到右下 另外中间步骤就是(好难描述啊)一个单调 ...