牛客多校第四场 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 ...
随机推荐
- 使用JMeter进行http压力测试
一.背景及文档目的说明 采用JMeter测试工具对腾讯视频做负载测试,使用 JMeter图形结果和聚合图帮助测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证系统的负载能力并估计系统瓶颈和并发 ...
- javascript 跨域问题 jsonp
转载:http://www.cnblogs.com/choon/p/5393682.html demo 用动态创建<script></script>节点的方式实现了跨域HTTP ...
- Oracle 、MySql 数据库表被锁的原因分析
记录一次准备给客户预演示出现的问题 事故的背景: 当所以功能开发完成后,开发人员在本地进行了测视已经没问题了.就把所有开发的功能模块合并到 dev 分支,进行打包,发布到预演示的线上环境.当在给相关人 ...
- python基础第9章 魔法方法、属性和迭代器(一)
__getitem__和__setitem__: 这个方法返回与指定键想关联的值.对序列来说,键应该是0~n-1的整数,其中n为序列的长度.对映射来说,键可以是任何类型. class A : __ge ...
- java-----Long转换为 int , string
int: 1.调用intValue()方法 long ll = 300000; int ii= new Long(ll).intValue(); 2.先把long转换成字符串String,然后在转行成 ...
- Java递归调用
6.递归调用 方法的递归调用就是方法自身调用自身. 以下程序因为递归没有结束的条件,所以一直压栈,没有弹栈,导致栈内存溢出错误!所以递归必须要有结束条件. public class Recursion ...
- 单调栈(最大子矩形强化版)——牛客多校第八场A
求01矩阵里有多少个不同的1矩阵 首先预处理出pre[i][j]表示i上面连续的1个数,对每行的高度进行单调栈处理 栈里的元素维护两个值:pre[i][j]和向前延伸最多能维护的位置pos 然后算贡献 ...
- NX二次开发-UFUN设置工程图PNG图片高度UF_DRF_set_image_height
#include <uf.h> #include <uf_drf.h> UF_initialize(); //插入PNG char* file_name = "D:\ ...
- Delph i2010
我在习惯Delphi2010 转载 一直留着一个txt文件,不晓得是干嘛的(忘记了),偶然打开一看.乖乖~ 2010 还可以这样玩. 1.循环有了新用法 procedure TForm1.Butt ...
- bagging和boosting以及rand-forest
bagging: 让该学习算法训练多轮,每轮的训练集由从初始的训练集中随机取出的n个训练样本组成,某个初始训练样本在某轮训练集中可以出现多次或根本不出现,训练之后可得到一个预测函数序列h_1,⋯ ⋯h ...