P3110 [USACO14DEC]驮运Piggy Back
传送门
做过次短路后,再来做这题感觉轻松不少。
这题看着就像最短路模板题。
思路:
虽说题目看起来比较水,但是码起来还是有点难度的。(对我这个蒟蒻来说)
这道题,跟"路障"一题差不多,都属于最短路中的分段求值。(即枚举两个最短路,及中间连接部分)
那么就有思路了:
①求出点 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的更多相关文章
- 洛谷P3110 [USACO14DEC]驮运Piggy Back
P3110 [USACO14DEC]驮运Piggy Back 题目描述 贝西和她的妹妹艾尔斯白天在不同的地方吃草,而在晚上他们都想回到谷仓休息.聪明的牛仔,他们想出了一个计划,以尽量减少他们在步行时花 ...
- 【题解】Luogu P3110 [USACO14DEC]驮运Piggy Back
[题解]Luogu P3110 [USACO14DEC]驮运Piggy Back 题目描述 Bessie and her sister Elsie graze in different fields ...
- Luogu P3110 [USACO14DEC]驮运Piggy Back
解题思路 看到下面很多人都在说什么遇到了之后要不要背着走,其实根本不需要,同样的我也是跑了三遍$SPFA$,求出了以$1$为起点到个点的$dist$,和以$2$为起点到个点的$dist$,还有以$n$ ...
- luogu P3110 [USACO14DEC]驮运Piggy Back |最短路
题目描述 Bessie and her sister Elsie graze in different fields during the day, and in the evening they b ...
- [USACO14DEC]驮运Piggy Back
题目描述 Bessie 和 Elsie在不同的区域放牧,他们希望花费最小的能量返回谷仓.从一个区域走到一个相连区域,Bessie要花费B单位的能量,Elsie要花费E单位的能量. 如果某次他们两走到同 ...
- 2018.08.17 洛谷P3110 [USACO14DEC]驮运(最短路)
传送门 一道sb最短路,从两个起点和终点跑一边最短路之后直接枚举两人的汇合点求最小值就行了. 代码: #include<bits/stdc++.h> #define N 40005 #de ...
- [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 & ...
- 洛谷 [P3110] 驮运
题目略带一点贪心的思想,先跑三遍最短路(边权为一,BFS比SPFA高效) 一起跑总比分开跑高效,枚举两人在何点汇合,输出最小值. #include <iostream> #include ...
- Piggy Back_KEY
Piggy Back (piggyback.pas/c/cpp) [问题描述] Bessie 和她的姐姐 Elsie 在不同的田块吃草,晚上她们都返回牛棚休息.作为聪明的奶牛,她们想设计一个方案使得步 ...
随机推荐
- node.js学习(一)
一.assert assert.deepEqual(actual, expected[, message]) 测试 actual 参数与 expected 参数是否深度相等. 原始值使用相等运算符(= ...
- java-工厂方法模式学习笔记
1.工厂模式分三种 1.1 普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例创建,如下图所示: 就以老司机开车(土豪开奔驰,宝马:屌丝骑自行车)为例,说明一下普通工厂模式: 首先,创 ...
- 基于ARM Cortex-M0+ 的Bootloader 参考
源: 基于ARM Cortex-M0+内核的bootloader程序升级原理及代码解析
- Java笔记 #03# HtmlUnit爬虫
存档留用 (= 存档留着备用) 爬的是一个开放的自动回复机器人 API 网站 http://i.itpk.cn/. 结构 大致如下: 我做的事情就是[输入文字,点击按钮,爬取内容],如上图所示. pa ...
- Python建立多线程任务并获取每个线程返回值
1.进程和线程 (1)进程是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其他用于跟踪执行的辅助数据.进程也可以派生新的进程来执行其他任务,不过每个新进程都拥有自己的内存和数据栈,所 ...
- Linux的常用路由配置
1.配置默认路由 ip route add default via 192.168.10.1 dev eth0 route add default gw 192.168.10.1 2.间接路由: ip ...
- Python3 hasattr()、getattr()、setattr()函数简介
Python3 hasattr().getattr().setattr()函数简介 一.hasattr(object, name) 判断object对象中是否存在name属性,当然对于python的对 ...
- poj 1159 Palindrome - 动态规划
A palindrome is a symmetrical string, that is, a string read identically from left to right as well ...
- bash 配置文件
两类: profile类:为交互式登录的shell进程提供配置 bashrc类:为非交互式登录的shell进程提供配置 登录类型: 交互式登录shell进程: 直接通过某终端输入账号和密码后登录打开的 ...
- phpMyAdmin - Error
centos7.5 原因:权限问题 解决方法:授权 [root@web01 code]# groupadd -g666 www [root@web01 code]# useradd -u666 -g6 ...