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 ...
随机推荐
- JAVA简易数据连接池Condition
用Condition和synchronized: import java.sql.Connection; import java.sql.DriverManager; import java.sql. ...
- 【代码优化】C#遍历所有控件(Control方法)
直接上代码: /// <summary> /// 判断价格是否可以购买技能的方法 /// </summary> /// <param name="btnBuyA ...
- .net Dapper 学习系列(2) ---Dapper进阶
目录 写在前面 前期准备 Dapper 单表批量添加 在Dapper 多表查询 在Dapper 调用存储过程 在Dapper 使用QueryMultiple进行多表查询 在Dapper 使用事务进行多 ...
- MPAndroid 的学习
1.MPAndroid 的github的地址: https://github.com/PhilJay/MPAndroidChart#documentation 2.使用步骤: 在build.gradl ...
- 浮动IP地址(Float IP)与 ARP欺骗技术
浮动IP地址: 一个网卡是可以添加多个IP的. 就是多个主机工作在 同一个集群中,即两台主机以上.每台机器除了自己的实IP外,会设置一个浮动IP,浮动IP与主机的服务(HTTP服务/邮箱服务)绑在一起 ...
- centos7划分vlan
1. lsmod|grep 8021q 确认内核是够载入了802.1q模组 2.modprobe -a 8021q 如果没载入使用这个命令载入模组 3.配置vlan需要vconfig命令,由于c ...
- Typora基础
Typora下载网址https://typora.io 一级标题 :# 空格 编写内容 二级标题 2*# 空格 内容 typora快捷键 ctrl+1 =一级标题 有序内容 1.+tab (Q旁边的t ...
- swagger2 404
swagger2 404 正确配置swagger后(配置),出现404问题. 如图: 分析原因 我是在配置完成swagger后正常使用过一段时间的,然后检查了相关配置项的代码,没有被改动过.可以确定s ...
- 如何删除mysql注释
Linux命令删除注释 先把库表导出成一个.sql文件,然后使用sed命令删除注释.此种适用于mysql端口不开外网的情况. $ cat create_table.sql create table t ...
- js中console.info的使用
语法:console.info(obj1 [, obj2, ..., objN]);console.info(msg [, subst1, ..., substN]); 参数obj1 ... objN ...