传送门

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

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

思路:

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

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

  那么就有思路了:

  ①求出点 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. 使用github管理Eclipse分布式项目开发

    使用github管理Eclipse分布式项目开发 老关我在前面的博文(github管理iOS分布式项目开发)中介绍了github管理iOS分布式开发,今天老关将向大家介绍使用github管 理Ecli ...

  2. 3、CentOS 6.5系统安装配置Tomcat 8详细过程

    安装环境:CentOS-6.5 安装方式:源码安装 软件:apache-tomcat-8.0.0.RC3.tar.gz 安装前提 安装tomcat 将apache-tomcat-8.0.0.RC3.t ...

  3. Hadoop学习笔记之三:DataNode

    DataNode对ClientDatanodeProtocol.InterDatanodeProtocol两个协议接口进行了实现,通过ipc::Server向Client.其它DN提供RPC服务(参见 ...

  4. SQLServer将服务器A表写到服务器B表

       不同服务器数据库之间的数据操作    --创建链接服务器  exec sp_addlinkedserver  'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '  ...

  5. memcache,redis对比

    一.问题:     数据库表数据量极大(千万条),要求让服务器更加快速地响应用户的需求.   二.解决方案:      1.通过高速服务器Cache缓存数据库数据      2.内存数据库     ( ...

  6. 利用webpack手动构建vue工程

    一 创建一个文件夹,在文件夹中打开命令行执行:$npm install 创建一个package文件 ,可以先忽略作者等信息: 二 安装webpack依赖包(根据需要安装)     //全局安装     ...

  7. @Entity 和 @Table

    Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库.这些普通Java对象被称作Entity Bean.除了是用Java Persis ...

  8. BATJ等大厂最全经典面试题分享

    金九银十,又到了面试求职高峰期,最近有很多网友都在求大厂面试题.正好我之前电脑里面有这方面的整理,于是就发上来分享给大家. 这些题目是网友去百度.蚂蚁金服.小米.乐视.美团.58.猎豹.360.新浪. ...

  9. eclipse 的版本及下载地址

    eclipse 的各个版本号: 版本号 代号 代号名 发布日期 Eclipse 3.1 IO 木卫一,伊奥 2005 Eclipse 3.2 Callisto 木卫四,卡里斯托 2006 Eclips ...

  10. pat 团体赛练习题集 L2-006. 树的遍历

    给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数.第二行给出其后序遍历序 ...