首先理解这里的美味值相当于给你更多时间让你经过这个草垛的,

也就是在经过草垛时可以给你的时间减少w[i],这样能否比最短路不慢

然而我们并不容易知道怎么走才是最好的,所以要想办法避免找这个方案

我们新建一个点,向每个草垛连一个边权为 d[u]-w[u] 的有向边,从这个点跑一次最短路

效果就相当于求了从每个点到这个新点的最短路,而我们看d2[x]的组成,

我们想要的效果是从x出发走到u,减去一个w[u],再走到n,看能不能更好

而走到u之后不走到n,而是走到这个新点,d2[x]的组成就是从x走到u再加上u点到新点的边权d[u]-w[u],效果是一样的

这样就很好的避免了找方案的问题

最后比较一下d2[x]和d[x]的大小

#include<bits/stdc++.h>
#define mp make_pair
using namespace std;
const int maxn=;
const int maxm=;
int n,m,k;
struct node{
int v,w,nxt;
}e[maxm*];
int head[maxn],cnt;
void add(int u,int v,int w){
e[++cnt].w=w;e[cnt].v=v;e[cnt].nxt=head[u];head[u]=cnt;
}
priority_queue<pair<int,int> >q;
int d[maxn],d2[maxn],v[maxn];
void dij(int s){
memset(d,0x3f,sizeof(d));
memset(v,,sizeof(v));
d[s]=;q.push(mp(,s));
while(!q.empty()){
int x=q.top().second;q.pop();
if(v[x])continue;v[x]=;
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].v,z=e[i].w;
if(d[y]>d[x]+z)
d[y]=d[x]+z,q.push(mp(-d[y],y));
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=,u,v,w;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
dij(n);
for(int i=;i<=n;i++)d2[i]=d[i];
for(int i=,u,w;i<=k;i++){
scanf("%d%d",&u,&w);
add(n+,u,d2[u]-w);
}
dij(n+);
for(int i=;i<n;i++)
if(d2[i]>=d[i])printf("1\n");
else printf("0\n");
}

[题解](最短路)luogu_P5122 Fine Dining的更多相关文章

  1. 题解 P5122 【[USACO18DEC]Fine Dining】

    思路:最短路+dp 1.先跑一遍最短路,计算出没有干草垛最少要多少时间 2.dp求出有干草垛至少需要多少时间,由于dp有后效性,所以用SPFA辅助转移,dp方程和求最短路一模一样,只是先将有干草垛的拉 ...

  2. [JZOJ5279]香港记者题解--最短路图

    [JZOJ5279]香港记者题解--最短路图 题目链接 过 于 暴 力 分析 有一个naiive的想法就是从1到n跑最短路,中途建图,然后在图上按字典序最小走一遍,然而·这是不行的,你这样跳不一定能跳 ...

  3. Luogu P5122 [USACO18DEC]Fine Dining 最短路

    先跑一遍n为起点最短路,再新开一个点,向有干草垛的点连一根边权为d[u]-w的有向边(很重要..我当时连的无向边,然后我死了.),相当于用价值抵消一部分边权, 然后以这个新的点为起点跑最短路就好了.. ...

  4. [USACO18DEC]Fine Dining

    题面 \(Solution:\) 一开始想的是先跑一遍最短路,然后拆点之后再跑一遍,比较两次dis,然后发现拆点后会有负环(可能是我没想对拆点的方法),于是就放弃了拆点法. 我们考虑强制让每头牛选择走 ...

  5. [洛谷P1144][题解]最短路计数

    这道题可以用各种算法踩掉,我选择的是SPFA. 因为题目要求计数,所以我们开一个ans数组表示数量. 分两种情况讨论: 一:dis_v>dis_u+1 最短路被更新了,可以直接ans_v=ans ...

  6. P1144 最短路计数 题解 最短路应用题

    题目链接:https://www.luogu.org/problem/P1144 其实这道题目是最短路的变形题,因为数据范围 \(N \le 10^6, M \le 2 \times 10^6\) , ...

  7. 洛谷P1462 通往奥格瑞玛的道路 题解 最短路+二分答案

    题目链接:https://www.luogu.com.cn/problem/P1462 题目大意: 有 \(n\) 个点 \(m\) 条边,每个点有一个点权,每个边有一个边权.求所有长度不超过 \(b ...

  8. HDU5521 Meeting 题解 最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 题目大意: 有 \(n\) 个点 \(m\) 个集合,一个点可能处于若干个集合内,属于第 \(i ...

  9. SP338ROADS题解--最短路变式

    题目链接 https://www.luogu.org/problemnew/show/SP338 分析 联想到不久前做过的一道题\(Full\) \(Tank\),感觉可以用优先队列做,于是写了\(d ...

随机推荐

  1. 【C++基础学习】数据封装、构造函数

    第一部分 类和对象 内存中按照用途被划分的五个区:栈区.堆区.全局区.常量区.代码区栈区由系统来进行控制,无论是内存的分配还是回收都不需要程序员关心堆区由new分配内存,使用完成之后必须使用delet ...

  2. Discuz/X3.1去掉标题中的Powered by Discuz!以及解决首页标题后的"-"

    虽然不提倡大家去掉版权信息,但是在实际操作的时候还是去掉,毕竟每个页面标题最后面出现”Powered by Discuz!“会显得页面标题比较冗长. 经过本人的实践,论坛里也有操作方法,不过那个操作方 ...

  3. 基于官方驱动封装mongodb

    还是一如既往先把结构图放出来,上上个版本添加了redis的缓存,但是不满足我的需求,因为公司有项目要求是分布式所以呢,这里我就增加了mongoDb进行缓存分布式,好了先看结构图(1). 总的来说比较蛋 ...

  4. 骨牌覆盖问题 KxM

    前面我们说了一些简单的骨牌覆盖问题,有了上面的经验,我们可以尝试解决K*M的 思路和上一篇文章所提到的3*N的 很类似: 依然是矩阵快速幂.我们需要把一个小的边固定下来作为的已知边,然后进行矩阵快速幂 ...

  5. 对Webview跨源攻击的理解

    首先是addJavaScriptInterface漏洞: 有时候访问手机百度贴吧网页版本,网页上会有个按钮提示用手机应用打开.这种交互通常都是使用JS来实现,而WebView已经提供了这样的方法,具体 ...

  6. Python interview_python

    https://github.com/taizilongxu/interview_python 1 Python的函数参数传递 strings, tuples, 和numbers是不可更改的对象,而l ...

  7. sublimelinter-php 错误代码提示

    先安装 SublimeLinter 如同其他插件一样使用 Package Control 来安装. 按下 Ctrl+Shift+p 进入 Command Palette 输入install进入 Pac ...

  8. Robot FrameWork基础学习(三)

    一.关键字(Keyword)根据架构的区分可分为以下三层结构: 底层关键字.公共层关键字.特性关键字. 底层关键字一般与最底层的代码在关系,为上层公共关键字和特性关键字提供接口. 公共层关键字:一般是 ...

  9. UVa 12105 Bigger is Better (DP)

    题意:用不超过 n 根火柴,组成一个尽可能大的数. 析:很明显的一个DP题,首先不难想到这个dp[i][j] 表示前 i 根火柴,所能拼出的取模 m 为 j 的数,状态转移方程也很好写, dp[i][ ...

  10. 【转】NET中管理数字证书(Digital Certificate)的一些类

    http://blog.csdn.net/bat800/article/details/2314510 http://blog.csdn.net/zjlovety/article/details/72 ...