(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

Catalog

Problem:传送门

Portal

 原题目描述在最下面。

 给你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] = min(dp[u][t],dp[v][t]+w);\\
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的更多相关文章

  1. HDU5669 Road 分层最短路+线段树建图

    分析:(官方题解) 首先考虑暴力,显然可以直接每次O(n^2) ​的连边,最后跑一次分层图最短路就行了. 然后我们考虑优化一下这个连边的过程 ,因为都是区间上的操作,所以能够很明显的想到利用线段树来维 ...

随机推荐

  1. 【JZOJ3673】【luoguP4040】【BZOJ3874】宅男计划

    description 外卖店一共有N种食物,分别有1到N编号.第i种食物有固定的价钱Pi和保质期Si.第i种食物会在Si天后过期.JYY是不会吃过期食物的. 比如JYY如果今天点了一份保质期为1天的 ...

  2. 存储emoji表情,修改字符集为utf8mb4

    SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%'; SET ch ...

  3. 帝国cms返回首页

    <a href="[!--news.url--]">返回首页</a>

  4. 浏览器表单默认记忆功能input的 autocomplete="off"属性

    一般情况下浏览器会有自动记录密码等的功能,但是有时候我们不需要这样的功能,下面有两种情况下关闭记忆功能有效: 1:在form中,如果有input[type=password],autocomplete ...

  5. Android API Levels 详解

    Android API Levels 当你开发你的Android应用程序时,了解该平台API变更管理的基本方法和概念是很有帮助的.同样的,知道API级别标识以及该标识如何保障你的应用与实际硬件设备相兼 ...

  6. Machine Learning 之二,什么监督性学习,非监督性学习。

    1.什么是监督性学习?Supervised  Machine Learning. 在监督性学习,我们给定一个数据集以及我们已经知道正确输出的结果,然后找到一个输入和输出的关系. In Supervis ...

  7. SQL比较时间查询语句

    select * from table1 where datediff(mm,'2009-8-12 13:17:50', date)>0 select * from table1 select ...

  8. 为了避免hexo博客换了电脑应该提前做的准备。

    个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 本文转自:https://www.jiansh ...

  9. ISA虚拟化的条件

    ISA(Instruction Set Architecture) 指令集体系结构,是硬件与软件层之间的接口. 本地系统虚拟机 本地系统虚拟机,就是Bare-Metal虚拟机,直接运行在硬件上,在它上 ...

  10. Android的WebView通过JS调用java代码

    做项目时候会遇到我们用WebView 打开一个web,希望这个web可以调用自己的一些方法,比如我们在进一个web页面,然后当我们点击web上的某个按钮时,希望能判断当前手机端是否已经登录,如果未登录 ...