牛客多校第四场 J Free 最短路
题意:
求最短路,但是你有k次机会可以把路径中某条边的长度变为0.
题解:
跑k+1次迪杰斯特拉,设想有k+1组dis数组和优先队列,第k组就意味着删去k条边的情况,每次松弛操作,松弛的两点i,j和距离l(i,j),不仅更新本组的dis数组令dis[j]=dis[i]+l[i,j],还更新下一组,令dis`[j]=dis[i],相当于删去边(i,j)
#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
#define INF 0x3f3f3f3f
struct Point{
int n,dis;
friend bool operator >(const Point &a,const Point &b){
return a.dis>b.dis;
}
friend bool operator <(const Point &a,const Point &b){
return a.dis<b.dis;
}
Point(){}
Point(int a,int b){
n=a;dis=b;
}
};
using namespace std;
int lik[][];
int dis[][];//删去了i条边后第j个点最短距离
priority_queue<Point,vector<Point>,greater<Point> > que[];
vector<Point>link[];
int main(){
int n,m,s,t,k;
scanf("%d %d %d %d %d",&n,&m,&s,&t,&k); memset(dis,INF,sizeof dis);
memset(lik,INF,sizeof lik);
for(int i=;i<=m;i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if(a==b)continue;
else{
lik[a][b]=min(lik[a][b],c);
lik[b][a]=min(lik[b][a],c);
}
} // for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++){
// printf("%d ",lik[i][j]);
// }
// printf("\n");
// } for(int i=;i<n;i++){
for(int j=i+;j<=n;j++){
if(lik[i][j]<INF){
link[i].push_back(Point(j,lik[i][j]));
link[j].push_back(Point(i,lik[j][i]));
} }
} // for(int i=1;i<=n;i++)printf("%d ",link[i].size()); // system("pause");
que[].push(Point(s,));
dis[][s]=; for(int i=;i<=k;i++){
while(!que[i].empty()){ Point tmp=que[i].top();
que[i].pop();
int u=tmp.n;
int nowd=tmp.dis;
if(nowd>dis[i][u])continue; // printf("*%d %d\n",u,nowd); for(int j=;j<link[u].size();j++){
int v=link[u][j].n;
int d=link[u][j].dis; if(dis[i][v]>nowd+d){
dis[i][v]=nowd+d;
que[i].push(Point(v,dis[i][v]));
} if(i<k && dis[i+][v]>nowd){
dis[i+][v]=nowd;
que[i+].push(Point(v,dis[i+][v]));
} // for(int w=0;w<=k;w++){
// for(int r=1;r<=n;r++){
// printf("%d ",dis[w][r]);
// }
// printf("\n");
// }
// printf("\n"); } }
}
// for(int w=0;w<=k;w++){
// for(int r=1;r<=n;r++){
// printf("%d ",dis[w][r]);
// }
// printf("\n");
// }
int minn=INF;
for(int i=;i<=k;i++){
minn=min(minn,dis[i][t]);
}
printf("%d\n",minn);
}
牛客多校第四场 J Free 最短路的更多相关文章
- 2019牛客多校第四场J free 最短路
free 题意 给出一个带权联通无向图,你需要从s走到t,你可以选择k条变让他们的权值为0问从s到t的最小权值是多少? 分析 思考一下,如果不带k条白嫖这个条件,那么这就是一个简单的dji就搞定了,我 ...
- 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)
题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...
- 2019牛客多校第四场J free——分层图&&最短路
题意 一张无向图,每条边有权值,可以选择不超过 $k$ 条路使其权值变成0,求 $S$ 到 $T$ 的最短路.(同洛谷 P4568) 分析 首先,分层图最短路可以有效解决这种带有 「阶段性」的最短路, ...
- 2018牛客多校第四场 J.Hash Function
题意: 给出一个已知的哈希表.求字典序最小的插入序列,哈希表不合法则输出-1. 题解: 对于哈希表的每一个不为-1的数,假如他的位置是t,令s = a[t]%n.则这个数可以被插入当且仅当第s ~ t ...
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
- 牛客多校第3场 J 思维+树状数组+二分
牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...
- 牛客多校第四场 F Beautiful Garden
链接:https://www.nowcoder.com/acm/contest/142/F来源:牛客网 题目描述 There's a beautiful garden whose size is n ...
- 牛客多校第五场 J:Plan
链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
- 牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)
链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ...
随机推荐
- cross compile vlc 播放器
上一篇文章介绍了如何交叉编译 FFmpeg ,继续介绍 VLC播放器 交叉编译 . 首先下载 vlc 源码 我用的是 2.2.6 地址 : http://mirrors.neusoft.edu ...
- pandas读书笔记、重新索引
重新索引 pandas对象的一个重要方法是 reindex ,其作用是创建一个适应新索引的新对象. #reindex函数的参数 reindex(index,method,fill_value, ...
- __stdcall,__cdecl,__fastcall,_stdcall,_cdecl,_fastcall 区别简介[转]
今天写线程函数时,发现msdn中对ThreadProc的定义有要求: DWORD WINAPI ThreadProc(LPVOID lpParameter); 不解为什么要用WINAPI宏定义,查 ...
- Perl 哈希
Perl 哈希 哈希是 key/value 对的集合. Perl中哈希变量以百分号 (%) 标记开始. 访问哈希元素格式:${key}. 以下是一个简单的哈希实例: 实例 #!/usr/bin/per ...
- Feign远程调用源码阅读
- NX二次开发-UF_MODL_intersect_objects获取两个对象的交点
NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> #include < ...
- [JZOJ 5129] 字符串
题意:统计本质不同的串的个数. 思路: 显然后缀自动机,对于每个串建一个\(SAM\)统计即可. #include <bits/stdc++.h> using namespace std; ...
- fastText一个库用于词表示的高效学习和句子分类
fastText fastText 是 Facebook 开发的一个用于高效学习单词呈现以及语句分类的开源库. 要求 fastText 使用 C++11 特性,因此需要一个对 C++11 支持良好的编 ...
- 修改ActiveProcessLinks链表隐藏进程
在Windows内核中有一个活动进程链表AcvtivePeorecssList.它是一个双向链表,保存着系统中所有进程的EPROCESS结构.特别地,进程的EPROCESS结构包含一个具有指针成员FL ...
- jQuery 基本使用
index.html <head><meta http-equiv="Content-Type" content="text/html; charset ...