传送门

做过次短路后,再来做这题感觉轻松不少。

这题看着就像最短路模板题。

思路:

  虽说题目看起来比较水,但是码起来还是有点难度的。(对我这个蒟蒻来说)

  这道题,跟"路障"一题差不多,都属于最短路中的分段求值。(即枚举两个最短路,及中间连接部分)

  那么就有思路了:

  ①求出点 1,点 2,点 n 到其他所有点的单源最短路径。(我用的是三次Dijkstra,打上瘾了)

  ②即最关键的是枚举每一个点(即两只牛相遇的点),计算相遇前,两只牛各自走过的路径耗费的能量,然后令两只牛相遇后强行连在一起,算出从相遇的点到仓库 n 所需的能量值,再将能量值求和 。每个点都如此枚举一遍,求最小的能量值和即为答案。

下为求解的关键代码:

    for(int i=; i<=n; i++)
ans=min(ans,d1[i]*B+d2[i]*E+d3[i]*P);

完整代码:

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
#include<set>
#include<map>
#include<vector>
#include<fstream>
using namespace std;
#define maxn 400005
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q1;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q2;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q3;
int head[maxn],d1[maxn],d2[maxn],d3[maxn],vis[maxn],cnt=,B,E,P,n,m,ans;
struct hh
{
int nex,to;
}t[maxn];
struct edge
{
int x,y;
}dd[maxn];
inline int read()
{
char kr=;
char ls;
for(;ls>''||ls<'';kr=ls,ls=getchar());
int xs=;
for(;ls>=''&&ls<='';ls=getchar())
{
xs=xs*+ls-;
}
if(kr=='-') xs=-xs;
return xs;
}
inline void add(int nex,int to)
{
t[++cnt].nex=head[nex];
t[cnt].to=to;
head[nex]=cnt;
}
inline void dijkstra_first(int ww)
{
memset(d1,0x3f3f3f3f,sizeof(d1));
memset(vis,,sizeof(vis));
q1.push(make_pair(,ww));
d1[ww]=;
while(!q1.empty())
{
int u=q1.top().second;
q1.pop();
if(vis[u]) continue;
vis[u]=;
for(int v=head[u];v;v=t[v].nex)
{
if(d1[t[v].to]>d1[u]+&&!vis[t[v].to])
{
d1[t[v].to]=d1[u]+;
q1.push(make_pair(d1[t[v].to],t[v].to));
}
}
}
}
inline void dijkstra_second(int ww)
{
memset(d2,0x3f3f3f3f,sizeof(d2));
memset(vis,,sizeof(vis));
q2.push(make_pair(,ww));
d2[ww]=;
while(!q2.empty())
{
int u=q2.top().second;
q2.pop();
if(vis[u]) continue;
vis[u]=;
for(int v=head[u];v;v=t[v].nex)
{
if(d2[t[v].to]>d2[u]+&&!vis[t[v].to])
{
d2[t[v].to]=d2[u]+;
q2.push(make_pair(d2[t[v].to],t[v].to));
}
}
}
}
inline void dijkstra_third(int ww)
{
memset(d3,0x3f3f3f3f,sizeof(d3));
memset(vis,,sizeof(vis));
q3.push(make_pair(,ww));
d3[ww]=;
while(!q3.empty())
{
int u=q3.top().second;
q3.pop();
if(vis[u]) continue;
vis[u]=;
for(int v=head[u];v;v=t[v].nex)
{
if(d3[t[v].to]>d3[u]+&&!vis[t[v].to])
{
d3[t[v].to]=d3[u]+;
q3.push(make_pair(d3[t[v].to],t[v].to));
}
}
}
}//三次最短路模板
int main()
{
B=read();E=read();P=read();n=read();m=read();
for(int i=;i<=m;i++)
{
dd[i].x=read();dd[i].y=read();
add(dd[i].x,dd[i].y);
add(dd[i].y,dd[i].x);//建无向图
}
dijkstra_first();
dijkstra_second();
dijkstra_third(n);
//cout<<d1[n]<<" "<<d2[n]<<" "<<d3[1]<<" "<<d3[2]<<endl;
ans=;
for(int i=; i<=n; i++)
ans=min(ans,d1[i]*B+d2[i]*E+d3[i]*P);//枚举每一个点,求出能量和,取小
cout<<ans<<endl;//输出
return ;
}

P3110 [USACO14DEC]驮运Piggy Back的更多相关文章

  1. 洛谷P3110 [USACO14DEC]驮运Piggy Back

    P3110 [USACO14DEC]驮运Piggy Back 题目描述 贝西和她的妹妹艾尔斯白天在不同的地方吃草,而在晚上他们都想回到谷仓休息.聪明的牛仔,他们想出了一个计划,以尽量减少他们在步行时花 ...

  2. 【题解】Luogu P3110 [USACO14DEC]驮运Piggy Back

    [题解]Luogu P3110 [USACO14DEC]驮运Piggy Back 题目描述 Bessie and her sister Elsie graze in different fields ...

  3. Luogu P3110 [USACO14DEC]驮运Piggy Back

    解题思路 看到下面很多人都在说什么遇到了之后要不要背着走,其实根本不需要,同样的我也是跑了三遍$SPFA$,求出了以$1$为起点到个点的$dist$,和以$2$为起点到个点的$dist$,还有以$n$ ...

  4. luogu P3110 [USACO14DEC]驮运Piggy Back |最短路

    题目描述 Bessie and her sister Elsie graze in different fields during the day, and in the evening they b ...

  5. [USACO14DEC]驮运Piggy Back

    题目描述 Bessie 和 Elsie在不同的区域放牧,他们希望花费最小的能量返回谷仓.从一个区域走到一个相连区域,Bessie要花费B单位的能量,Elsie要花费E单位的能量. 如果某次他们两走到同 ...

  6. 2018.08.17 洛谷P3110 [USACO14DEC]驮运(最短路)

    传送门 一道sb最短路,从两个起点和终点跑一边最短路之后直接枚举两人的汇合点求最小值就行了. 代码: #include<bits/stdc++.h> #define N 40005 #de ...

  7. [luoguP3110] [USACO14DEC]驮运Piggy Back(SPFA || BFS)

    传送门 以 1,2,n 为起点跑3次 bfs 或者 spfa 那么 ans = min(ans, dis[1][i] * B + dis[2][i] * E + dis[3][i] * P) (1 & ...

  8. 洛谷 [P3110] 驮运

    题目略带一点贪心的思想,先跑三遍最短路(边权为一,BFS比SPFA高效) 一起跑总比分开跑高效,枚举两人在何点汇合,输出最小值. #include <iostream> #include ...

  9. Piggy Back_KEY

    Piggy Back (piggyback.pas/c/cpp) [问题描述] Bessie 和她的姐姐 Elsie 在不同的田块吃草,晚上她们都返回牛棚休息.作为聪明的奶牛,她们想设计一个方案使得步 ...

随机推荐

  1. Java开发软件安装及配置

    2017-6-1 1.jdk 1.8.0_131 安装JDK 选择安装目录 安装过程中会出现两次 安装提示 . 第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的 ...

  2. Pytorch-学习记录 卷积操作 cnn output_channel, etc.

    参考资料: pytorch中文文档 http://pytorch-cn.readthedocs.io/zh/latest/

  3. php 加密 解密 密码传输

    php 加密 解密 密码传输 <?php /* * * 使用按位异或运算 加密 * $str 明文 * $salt 盐 * */ public static function xor_encry ...

  4. Golang并发编程进程通信channel了解及简单使用

    概念及作用 channel是一个数据类型,用于实现同步,用于两个协程之间交换数据.goroutine奉行通过通信来共享内存,而不是共享内存来通信.引用类型channel是CSP模式的具体实现,用于多个 ...

  5. Linux共享内存的管理

    在进程通信应用中会用到共享内存,这就涉及到了IPC,与IPC相关的命令包括:ipcs.ipcrm(释放IPC).IPCS命令是Linux下显示进程间通信设施状态的工具.我们知道,系统进行进程间通信(I ...

  6. centos7.3安装Nginx

    首先,如果是阿里云的centos的话,去阿里云管理端为80端口设置一组访问规则,因为阿里云默认是不开的 1. 添加Nginx yum 资源库 rpm -Uvh http://nginx.org/pac ...

  7. mint-ui之Loadmore使用

    <template> <div class="page-loadmore"> <div class="page-loadmore-wrapp ...

  8. USB通信基础知识

    1 USB系统组成 主机:提供USB接口和接口管理功能的硬件.软件.固件的复合体.PC机或OTG设备,一个USB系统只能有一个主机 设备:1.集线器HUB:扩展主机接口,设备可以通过其接入主机  2. ...

  9. Testng测试报告

    执行完测试用例之后,会在项目的test-output(默认目录)下生成测试报告

  10. Oracle SQL——inner jion;left join;right join的区别和使用场景

    背景 在一次面试的时候,面试官让我说一下这三者的使用场景和区别,当时瞬间懵逼,哈哈.回来赶快看一看,记下来. 详解 inner join 等值查询:返回两张表中,联结字段值相等的组合记录 举例:所有学 ...