2018 ACM-ICPC南京网络赛 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,v≤n). Every road has a distance c_ici​. Haze is a Magical Girl that lives in City 11, she can choose no more than KK roads and make their distances become 00. Now she wants to go to City NN, please help her calculate the minimum distance.
Input

The first line has one integer T(1 \le T\le 5)T(1≤T≤5), then following TT cases.

For each test case, the first line has three integers N, MN,M and KK.

Then the following MM lines each line has three integers, describe a road, U_i, V_i, C_iUi​,Vi​,Ci​. There might be multiple edges between uu and vv.

It is guaranteed that N \le 100000, M \le 200000, K \le 10N≤100000,M≤200000,K≤10,
0 \le C_i \le 1e90≤Ci​≤1e9. There is at least one path between City 11 and City NN.
Output

For each test case, print the minimum distance.

样例输入复制

1
5 6 1
1 2 2
1 3 4
2 4 3
3 4 1
3 5 6
4 5 2

样例输出复制

3

边去重+分层最短路
分层图最短路,就是在分层图上解决最短路问题。
一般解决方法是多开一维记录状态,多开的维度记录状态的种类数即为分层数。

基本模型:在图上,有k次机会可以直接通过一条边而不计算边权,问起点与终点之间的最短路径。
多一种情况松弛判断就行,其实和bfs思想相同

和这个题一模一样的飞行路线HYSBZ2763

code:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
const int maxm = 200005;
const int INF = 0x3f3f3f3f;
typedef long long ll;
struct node{int u,v;ll w;bool operator < (const node &a)const{//给边进行排序用于去重边选较短的if(u == a.u && v == a.v) return w < a.w;else if(u == a.u) return v < a.v;return u < a.u;}
}edge[maxm<<1];
struct Node{ll dis;int x,k;Node(){}Node(ll d,ll u, ll cnt):dis(d),x(u),k(cnt){}bool operator < (const Node &a)const{return dis > a.dis;}
};
int n,m,k,head[maxn],cnt;
int to[maxm<<1],nxt[maxm<<1];
ll val[maxm<<1];
bool vis[maxn][15];
ll dis[maxn][15],ans;inline void addedge(int u,int v,int w){to[++cnt] = v;nxt[cnt] = head[u];val[cnt] = w;head[u] = cnt;
}void dijkstra(){priority_queue<Node> q;memset(dis,INF,sizeof(dis));memset(vis,0,sizeof(vis));dis[1][0] = 0;//起点未让任何变为0,到达起点距离为0q.push(Node(0,1,0));while(!q.empty()){Node tmp = q.top();q.pop();int x = tmp.x,lev = tmp.k;if(vis[x][lev]) continue;//如果已经从这个点当前状态出发松弛过了,就跳过防止死循环vis[x][lev] = 1;//标记已经从这个点当前状态出发松弛过了for(int i = head[x]; i; i = nxt[i]){//开始松弛能到达的点int u = to[i];//分两种情况if(dis[x][lev] + val[i] < dis[u][lev]){//在不使任何新的边为0的情况下的松弛,相当于普通dijkdis[u][lev] = dis[x][lev] + val[i];if(!vis[u][lev]) q.push(Node(dis[u][lev],u,lev));//如果这个点这种状态还没当过出发点松弛就入队}if(lev + 1 <= k && dis[x][lev] < dis[u][lev+1]){//如果是这条边为0,再进行松弛,然后同上判断是否入队dis[u][lev+1] = dis[x][lev];if(!vis[u][lev+1]) q.push(Node(dis[u][lev+1],u,lev+1));}}}
}
int main(){int T;scanf("%d",&T);while(T--){cnt = 0;ans = 1e18;memset(head,0,sizeof(head));scanf("%d%d%d",&n,&m,&k);for(int i = 1; i <= m; i++){scanf("%d%d%lld",&edge[i].u,&edge[i].v,&edge[i].w);}//先暂时存边,但不存图int preu = -1,prev = -1;sort(edge+1,edge+1+m);//边去重,边建图for(int i = 1; i <= m; i++){if(!(edge[i].u == preu && edge[i].v == prev)){addedge(edge[i].u,edge[i].v,edge[i].w);preu = edge[i].u;prev = edge[i].v;   }}dijkstra();for(int i = 0; i <= k; i++) ans = min(ans,dis[n][i]);printf("%lld\n",ans);}   return 0;
}

2018 ACM-ICPC南京网络赛 Magical Girl Haze(分层最短路)相关推荐

  1. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  2. 2018 ACM/ICPC 南京站小结

    第一次打现场赛,又是在半主场,其实挺激动的,但是结果不尽人意 热身赛 开幕式后的热身赛就打得有些问题,四个题都不难,我们都想到了做法,但因为机时不够+细节问题导致前两个小时一直没有过题,然后AC的三道 ...

  3. HDU - 5875 2016 ACM/ICPC 大连网络赛 H题 暴力

    题目链接 题意:给你一个区间l,r一直将val[l]模上val[l+1],val[l+2]...val[r],因为一个模上比前一个数小数是没有意义的,所以需要将每一个点找到右边第一个小于他的点就行. ...

  4. HDU - 5876 Sparse Graph 2016 ACM/ICPC 大连网络赛 I题 bfs+set+补图最短路

    题目链接 题意:给的补图,让你求一个源点到其他点的最短距离,因为图太稠密了, 用dij以及spfa根本不得行,这里只能用一种我不会方法来进行,这里用了bfs的方法以及set来维护,分别set维护一个未 ...

  5. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

  6. 2013 ACM/ICPC 长沙网络赛J题

    题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...

  7. 2019 ICPC 南京网络赛 F Greedy Sequence

    You're given a permutation aa of length nn (1 \le n \le 10^51≤n≤105). For each i \in [1,n]i∈[1,n], c ...

  8. 解题报告(一)F、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts(数学期望 + 乘法原理 + FWT)(4.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  9. 2019ICPC南京网络赛A题 The beautiful values of the palace(三维偏序)

    2019ICPC南京网络赛A题 The beautiful values of the palace https://nanti.jisuanke.com/t/41298 Here is a squa ...

最新文章

  1. markdown 基本语法
  2. 独家福利 | 科大讯飞全球1024开发者节限时免费门票!
  3. POJ 1321 棋盘问题【DFS】
  4. 深入理解iframe
  5. plsql存储过程修改后怎么保存_Solidity变量存储位置与gas成本详解
  6. Apache Commons ArrayUtils.toString(Object)与JDK Arrays.toString(Object)
  7. 非Java专家的APM:什么泄漏?
  8. C++项目中编译部分C的代码
  9. SSM框架-实现Mybatis分页功能-foreknow_cms
  10. 北京住房仰视链,你在第几层?
  11. windows库的创建和使用:静态库+动态库
  12. w3wp对应进程_认识w3wp.exe进程,从根本上解决占用资源较大问题
  13. mysql里判断_mysql里如何使用判断语句?
  14. 将多张图片合并为一张图片
  15. How to learn Japanese ?
  16. LOL-无双剑姬我的最爱
  17. python俗称_python中文叫什么
  18. PHPExcel导入excel的内容以及表格里的图片
  19. ADB interface驱动安装失败解决方法
  20. 网上流传的《名侦探柯南》大结局十二种!

热门文章

  1. 可以添加Google adsense广告和阿里妈妈的博客汇总
  2. 微信小程序OCR插件使用指南
  3. 【数据库】编写存储过程
  4. MThings连接移动OneNet物联网平台
  5. 2018年医疗大数据产业的发展及解决方案
  6. 小程序昵称突然变成了微信用户头像变成了默认
  7. 软考高项——【第一章-信息系统】超详细知识点
  8. c盘扩容提示簇被标记_技能+ | C盘空间满了怎么办?无需格式化、不用重装系统,教你如何轻松搞定扩容...
  9. 每日一支TED——Ethan Nadelmann:为什么我们应该终止禁毒战争
  10. 爱奇艺自主研发的动态化框架!