HDU5669
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦
Catalog
Problem:传送门
原题目描述在最下面。
给你n个点,m组边: a, b ,c ,d ,w.表示点[a,b]与点[c,d]有一条权值为w的无向边。求1-n的最短路。
有k次把一条边权值变为0的魔法。
Solution:
线段树优化建边。对于魔法就在求最短路的时候再加一维处理。
dp[i][j]表示到点i用了j次魔法的最短路径长度。
dp[u][t+1] = min(dp[u][t+1],dp[v][t]);//t+1<=k
\]
AC_Code:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define lson rt << 1
#define rson rt << 1 | 1
using namespace std;
typedef long long LL;
const LL INF = 0x3f3f3f3f;
const int MXN = 6e5 + 5;
const int MXE = 4e6 + 6;
int n, m, k;
int inde;
vector<int>vs, vt;
struct lp{
int v, nex;
int w;
friend bool operator < (const lp &a,const lp &b) {
return a.w > b.w;
}
}cw[MXE], A, B;
int head[MXN], tot;
int dis[MXN][12];
int vis[MXN][12];
void add_edge(int u,int v,int w) {
cw[++tot].v = v; cw[tot].w = w; cw[tot].nex = head[u];
head[u] = tot;
}
int seg[MXN][2];
void build(int id,int l,int r,int rt) {
seg[rt][id] = ++inde;
if(l == r) {
if(id) add_edge(seg[rt][id], l, 0);
else add_edge(l, seg[rt][id], 0);
return;
}
int mid = (l + r) >> 1;
build(id, l, mid, lson); build(id, mid + 1, r, rson);
if(id) {
add_edge(seg[rt][id], seg[lson][id], 0); add_edge(seg[rt][id], seg[rson][id], 0);
}else {
add_edge(seg[lson][id], seg[rt][id], 0); add_edge(seg[rson][id], seg[rt][id], 0);
}
}
void query(int id,int L,int R,int l,int r,int rt) {
if(L <= l && r <= R) {
if(id) vs.push_back(seg[rt][id]);
else vt.push_back(seg[rt][id]);
return;
}
int mid = (l + r) >> 1;
if(L > mid) query(id, L, R, mid+1, r, rson);
else if(R <= mid) query(id,L,R,l,mid,lson);
else {
query(id,L,mid,l,mid,lson); query(id,mid+1,R,mid+1,r,rson);
}
}
void dij() {
for(int i = 1; i <= inde; ++i) {
for(int j = 0; j <= k; ++j) {
dis[i][j] = INF;
vis[i][j] = 0;
}
}
dis[1][0] = 0;
A.v = 1; A.w = 0; A.nex = 0;
priority_queue<lp> Q;
Q.push(A);
while(!Q.empty()) {
B = Q.top(); Q.pop();
int u = B.v, t = B.nex;
if(vis[u][t]) continue;
vis[u][t] = 1;
for(int i = head[u]; ~i; i = cw[i].nex) {
int v = cw[i].v;
if(dis[v][t] > dis[u][t] + cw[i].w) {
dis[v][t] = dis[u][t] + cw[i].w;
A.v = v; A.w = dis[v][t]; A.nex = t;
Q.push(A);
}
if(t < k && dis[v][t+1] > dis[u][t]) {
dis[v][t+1] = dis[u][t];
A.v = v; A.w = dis[v][t+1]; A.nex = t+1;
Q.push(A);
}
}
}
int ans = INF;
for(int i = 0; i <= k; ++i) ans = min(ans, dis[n][i]);
if(ans >= INF) printf("CreationAugust is a sb!\n");
else printf("%d\n", ans);
}
int main() {
int tim;
scanf("%d", &tim);
while(tim --) {
scanf("%d%d%d", &n, &m, &k);
int a, b, c, d, w;
memset(head, -1, sizeof(head));
tot = -1;
inde = n;
build(1, 1, n, 1); build(0, 1, n, 1);
for(int i = 0, ta, tb; i < m; ++i) {
scanf("%d%d%d%d%d", &a, &b, &c, &d, &w);
vs.clear(); vt.clear();
query(1,c,d,1,n,1); query(0,a,b,1,n,1);
ta = vs.size(); tb = vt.size();
for(int i = 0; i < tb; ++i) {
for(int j = 0; j < ta; ++j) {
add_edge(vt[i], vs[j], w);
}
}
vs.clear(); vt.clear();
query(1,a,b,1,n,1); query(0,c,d,1,n,1);
a = vs.size(); b = vt.size();
for(int i = 0; i < b; ++i) {
for(int j = 0; j < a; ++j) {
add_edge(vt[i], vs[j], w);
}
}
}
dij();
}
return 0;
}
Problem Description:
HDU5669的更多相关文章
- HDU5669 Road 分层最短路+线段树建图
分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) 的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维 ...
随机推荐
- MySQL - 两种存储引擎 (MyISAM PK InnoDB) + MVCC
总结 1.两种存储引擎各有各的有点,MyISAM专注性能,InnoDB专注事务.两者最大的区别就是InnoDB支持事务,和行锁. 2.InnoDB采用MVCC(Multi-Version Concur ...
- 基于Flink和规则引擎的实时风控解决方案
案例与解决方案汇总页:阿里云实时计算产品案例&解决方案汇总 对一个互联网产品来说,典型的风控场景包括:注册风控.登陆风控.交易风控.活动风控等,而风控的最佳效果是防患于未然,所以事前事中和事后 ...
- A*寻路算法C++简单实现
搜索区域 如图所示简易地图, 其中绿色方块的是起点 (用 A 表示), 中间蓝色的是障碍物, 红色的方块 (用 B 表示) 是目的地. 为了可以用一个二维数组来表示地图, 我们将地图划分成一个个 ...
- Angularjs 1.3在页面中输出带Html标记的文本
如何Angularjs1.3在页面中输出带Html标记的文本 基于安全考虑,Angularjs不允许用ng-bind或者{{}}的方法输出html文本. 在实际的应用中,比如信息管理系统,用在线编辑器 ...
- 2019 wannafly winter camp day5-8代码库
目录 day5 5H div2 Nested Tree (树形dp) 5F div2 Kropki (状压dp) 5J div1 Special Judge (计算几何) 5I div1 Sortin ...
- [nRF51822 AK II 教程]第一课,开发环境的配置及背景介绍【转】
低功耗蓝牙4.0是全新的技术,并不向下兼容,也就是说它和蓝牙3.0.2.0什么的都不能通信的.另外,蓝牙4.0目前的规范只能做外设和主机(智能手机,电脑等)通讯,也就是说你想用一个单模的蓝牙4.0开发 ...
- docker 镜像中心搭建
1.由于国外镜像很慢,所以用了网易蜂巢的镜像docker pull hub.c.163.com/library/registry:2.5.2本地的存储空间挂载到容器内部,持久保存镜像中心文件docke ...
- Openstack贡献者须知 — OpenPGP/SSH/CLA贡献者协议
目录 目录 前言 Openstack基金委员会 Openstack贡献者须知 注册Openstack In Launchpad 生成并上传OpenPGP密钥 生成并上传SSH公钥 Join The O ...
- 3、获取APP 内存占用率
关于APP内存占用,不用多说,应该是APP性能测试中比较重要的一点.试想一下,开个应用把手机内存占满了,其它应用无法打开,那么这个应用还会有人安装吗?我觉得是没有的.下面就通过adb命令获取APP虚存 ...
- 20140808 const和define区别 内联函数(inline) 栈和堆的地址分配 栈帧
1.const和define区别 const有数据类型(不能改变的变量),define只是简单的字符串替换,没有数据类型. C++程序用const完全取代 define. const还可以类成员函数为 ...