luoguP3003 [USACO10DEC]苹果交货Apple Delivery
一句话题意:
三个点a1,a2,b,求从b到a1和a2的最短路
做法:求出a1->b和a2->b的最短路,两者取min,之后再加上a1->a2的最短路
为啥呢
由于题目中说:没有路会从另一个牧场走回自己
所以图只有以下三种情况



emmmmmmm
懂了吗
另外注意裸的SPFA会TLE3个点,可以用SLF优化(有人说LLL会TLE4个……)
堆优化Dijkstra可以直接过
下面给出SPFA的代码和堆优化Dijkstra的代码
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
const int N=,M=;
#define gc() (SS==TT &&(TT=(SS=IN)+fread(IN,1,1<<20,stdin),SS==TT)?EOF:*SS++)
char IN[<<],*SS=IN,*TT=IN;
int n,m,st,e1,e2,q[N+M],h[N];
struct Edge{
int u,v,w,nxt;
}edge[M<<];
bool vis[N];
int dis[N],num;
inline int read()
{
int n=,w=;register char c=gc();
while(c>''||c<''){if(c=='-')w=-;c=gc();}
while(c>=''&&c<='')n=n*+c-'',c=gc();
return n*w;
}
inline void add(int u,int v,int w)
{
edge[++num].u=u;
edge[num].v=v;
edge[num].w=w;
edge[num].nxt=h[u];
h[u]=num;
}
inline void SPFA(int s)
{
memset(dis,0x7f,sizeof dis);
int head=,tail=;
q[++tail]=s;
dis[s]=;vis[s]=true;
while(head<tail)
{
int now=q[++head];
vis[now]=false;
for(int v,i=h[now];i;i=edge[i].nxt)
{
v=edge[i].v;
if(dis[v]>dis[edge[i].u]+edge[i].w)
{
dis[v]=dis[edge[i].u]+edge[i].w;
if(!vis[v])
{
vis[v]=true;
if(dis[v]>dis[q[head+]]||head==tail)
q[++tail]=v;
else q[head--]=v;//双端队列
}
}
}
}
}
int main()
{
m=read(),n=read(),st=read(),e1=read(),e2=read();
for(int u,v,w,i=;i<m;++i)
{
u=read(),v=read(),w=read();
add(u,v,w);add(v,u,w);
}
int ans1,ans2;
SPFA(e1);
ans1=dis[st]+dis[e2];
SPFA(e2);
ans2=dis[st]+dis[e1];
printf("%d",std::min(ans1,ans2));
return ;
}
SLF优化SPFA
// luogu-judger-enable-o2
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N=,M=;
#define gc() (SS==TT &&(TT=(SS=IN)+fread(IN,1,1<<20,stdin),SS==TT)?EOF:*SS++)
#define pr pair<int,int>
#define mp make_pair
int n,m,st,e1,e2,head[N];
struct Edge{
int v,w,nxt;
}edge[M<<];
bool vis[N];
int dis[N],num;
char IN[<<],*SS=IN,*TT=IN;
std::priority_queue<pr,vector<pr>,greater<pr> > que;
inline int read()
{
int n=,w=;register char c=gc();
while(c>''||c<''){if(c=='-')w=-;c=gc();}
while(c>=''&&c<='')n=n*+c-'',c=gc();
return n*w;
}
inline void add(int u,int v,int w)
{
edge[++num].v=v;
edge[num].w=w;
edge[num].nxt=head[u];
head[u]=num;
}
inline void Dijkstra(int s)
{
memset(dis,0x6f,sizeof dis);
memset(vis,false,sizeof vis);
dis[s]=;que.push(mp(,s));
int emp;
while(!que.empty())
{
emp=que.top().second;que.pop();
if(vis[emp])continue;
vis[emp]=true;
for(int i=head[emp];i;i=edge[i].nxt)
if(dis[edge[i].v]>dis[emp]+edge[i].w)
{
dis[edge[i].v]=dis[emp]+edge[i].w;
que.push(mp(dis[edge[i].v],edge[i].v));
}
}
} int main()
{
m=read(),n=read(),st=read(),e1=read(),e2=read();
for(int u,v,w,i=;i<m;++i)
{
u=read(),v=read(),w=read();
add(u,v,w);add(v,u,w);
}
int ans1,ans2;
Dijkstra(e1);
ans1=dis[e2]+dis[st];
Dijkstra(e2);
ans2=dis[e1]+dis[st];
printf("%d",std::min(ans1,ans2));
return ;
}
堆优化Dijkstra
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N=,M=;
#define pr pair<int,int>
#define mp make_pair
int n,m,st,e1,e2,head[N];
struct Edge{
int u,v,w,nxt;
}edge[M<<];
bool vis[N];
int dis[N],num;
std::priority_queue<pr,vector<pr>,greater<pr> > que;
inline int read()
{
int n=,w=;register char c=getchar();
while(c>''||c<''){if(c=='-')w=-;c=getchar();}
while(c>=''&&c<='')n=n*+c-'',c=getchar();
return n*w;
}
inline void add(int u,int v,int w)
{
edge[num].u=u;
edge[num].v=v;
edge[num].w=w;
edge[num].nxt=head[u];
head[u]=num++;
return ;
}
inline int Dijkstra(int s,int e)
{
memset(dis,0x6f,sizeof dis);
memset(vis,false,sizeof vis);
while(!que.empty())que.pop();
dis[s]=;que.push(mp(,s));
int emp;
while(!que.empty())
{
emp=que.top().second;que.pop();
if(vis[emp])continue;
vis[emp]=true;
if(emp==e)return dis[e];
for(int i=head[emp];i!=-;i=edge[i].nxt)
if(dis[edge[i].v]>dis[emp]+edge[i].w)
{
dis[edge[i].v]=dis[emp]+edge[i].w;
que.push(mp(dis[edge[i].v],edge[i].v));
}
}
return dis[e];
} int main()
{
memset(head,-,sizeof head);
m=read(),n=read(),st=read(),e1=read(),e2=read();
for(int u,v,w,i=;i<m;++i)
{
u=read(),v=read(),w=read();
add(u,v,w);add(v,u,w);
}
int ans1,ans2;
ans1=Dijkstra(st,e1);
ans2=Dijkstra(st,e2);
printf("%d",std::min(ans1,ans2)+Dijkstra(e1,e2));
return ;
}
真·堆优化Dijkstra
后两个的区别主要是跑两遍与跑三遍……
luoguP3003 [USACO10DEC]苹果交货Apple Delivery的更多相关文章
- 洛谷P3003 [USACO10DEC]苹果交货Apple Delivery
P3003 [USACO10DEC]苹果交货Apple Delivery 题目描述 Bessie has two crisp red apples to deliver to two of her f ...
- 洛谷——P3003 [USACO10DEC]苹果交货Apple Delivery
P3003 [USACO10DEC]苹果交货Apple Delivery 这题没什么可说的,跑两遍单源最短路就好了 $Spfa$过不了,要使用堆优化的$dijkstra$ 细节:1.必须使用优先队列+ ...
- 洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery
洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery 题目描述 Bessie has two crisp red apples to deliver to two of he ...
- P3003 [USACO10DEC]苹果交货Apple Delivery
题目描述 Bessie has two crisp red apples to deliver to two of her friends in the herd. Of course, she tr ...
- Dijkstra【p3003(bzoj2100)】[USACO10DEC]苹果交货Apple Delivery
Description 贝西有两个又香又脆的红苹果要送给她的两个朋友.当然她可以走的C(1<=C<=200000)条"牛路"都被包含在一种常用的图中,包含了P(1< ...
- 洛谷P3003 苹果交货Apple Delivery
题目描述 贝西有两个又香又脆的红苹果要送给她的两个朋友.当然她可以走的\(C(1 \leq C \leq 200000)\)条"牛路"都被包含在一种常用的图中,包含了\(P(1 \ ...
- USACO Apple Delivery
洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery 洛谷传送门 JDOJ 2717: USACO 2010 Dec Silver 1.Apple Delivery JDOJ ...
- BZOJ 2100: [Usaco2010 Dec]Apple Delivery( 最短路 )
跑两遍最短路就好了.. 话说这翻译2333 ---------------------------------------------------------------------- #includ ...
- iOS - 苹果官方Apple Pay开发文档(中文版)- Apple Pay(1)
翻译自苹果官方Apple Pay开发文档.目前版本为1.0 概览: Apple Pay为用户从你的App里购买实际的物品和服务提供简单而安全的方法.通过Touch ID,用户可使用储存在iPhone ...
随机推荐
- Drool7s 什么叫KIE和生命周期-系列03课
KIE是缩写,knowledge is everything.可以理解成一个上层接口,本质是由很多个实现类去实现功能的. 另外关于drool7s的生命周期,请看下图 本文只是让你了解drools7的一 ...
- 你也可以写个聊天程序 - C# Socket学习1
原文:你也可以写个聊天程序 - C# Socket学习1 简述 我们做软件工作的虽然每天都离不开网络,可网络协议细节却不是每个人都会接触和深入了解.我今天就来和大家一起学习下Socket,并写一个简单 ...
- ArcGIS Engine中C#开发不能引用ESRI.ArcGIS.AxControls问题
问题:ArcGIS Engine中C#开发不能引用ESRI.ArcGIS.AxControls问题 解决方法:将这里的特定版本改成“False”即可.
- jquery跨js文件调用函数示例
var common_func; (function() { common_func = { load_hot_data: function(AreaCode) { var hot_html = &q ...
- Microsoft Project项目管理工具
下载 网址 安装 要注意以前安装的32位的Office或者Visio时这里会检测到,这里也要装32位的.不能根据系统位数来了.下载前先看清你用的Microsoft的软件是什么版本. 使用 新建空白项目 ...
- Vue学习之Webpack基本使用小结(十三)
一.新建dist 文件夹: 二.新建src文件夹: 在其下面创建 css .js .images文件夹及 index.html.main.js(这是项目Js的主入口) 三.html中简单创建一个列表: ...
- day 19 作业
今日作业 1.什么是对象?什么是类? 对象是特征与技能的结合体,类是一系列对象相同的特征与技能的结合体 2.绑定方法的有什么特点 由对象来调用称之为对象的绑定方法,不同的对象调用该绑定方法,则会将不同 ...
- eclipse svn 提交、更新报错
问题描述: svn: Unable to connect to a repository at URL 'https://test.com/svn/clouds/trunk/fire_Alarm'sv ...
- 基于GDI显示png图像
intro 先前基于GDI已经能够显示BITMAP图像:windows下控制台程序实现窗口显示 ,其中BMP图像是使用LoadImage()这一Win32 API函数来做的.考虑到LoadImage( ...
- Linux 常见 RAID 及软 RAID 创建
RAID可以大幅度的提高磁盘性能,以及可靠性,这么好的技术怎么能不掌握呢!此篇介绍一些常见RAID,及其在Linux上的软RAID创建方法. mdadm 创建软RAID mdadm -C -v /de ...