LOL新英雄卡莎点击就送

一句话题意:

三个点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的更多相关文章

  1. 洛谷P3003 [USACO10DEC]苹果交货Apple Delivery

    P3003 [USACO10DEC]苹果交货Apple Delivery 题目描述 Bessie has two crisp red apples to deliver to two of her f ...

  2. 洛谷——P3003 [USACO10DEC]苹果交货Apple Delivery

    P3003 [USACO10DEC]苹果交货Apple Delivery 这题没什么可说的,跑两遍单源最短路就好了 $Spfa$过不了,要使用堆优化的$dijkstra$ 细节:1.必须使用优先队列+ ...

  3. 洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery

    洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery 题目描述 Bessie has two crisp red apples to deliver to two of he ...

  4. P3003 [USACO10DEC]苹果交货Apple Delivery

    题目描述 Bessie has two crisp red apples to deliver to two of her friends in the herd. Of course, she tr ...

  5. Dijkstra【p3003(bzoj2100)】[USACO10DEC]苹果交货Apple Delivery

    Description 贝西有两个又香又脆的红苹果要送给她的两个朋友.当然她可以走的C(1<=C<=200000)条"牛路"都被包含在一种常用的图中,包含了P(1< ...

  6. 洛谷P3003 苹果交货Apple Delivery

    题目描述 贝西有两个又香又脆的红苹果要送给她的两个朋友.当然她可以走的\(C(1 \leq C \leq 200000)\)条"牛路"都被包含在一种常用的图中,包含了\(P(1 \ ...

  7. USACO Apple Delivery

    洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery 洛谷传送门 JDOJ 2717: USACO 2010 Dec Silver 1.Apple Delivery JDOJ ...

  8. BZOJ 2100: [Usaco2010 Dec]Apple Delivery( 最短路 )

    跑两遍最短路就好了.. 话说这翻译2333 ---------------------------------------------------------------------- #includ ...

  9. iOS - 苹果官方Apple Pay开发文档(中文版)- Apple Pay(1)

    翻译自苹果官方Apple Pay开发文档.目前版本为1.0 概览: Apple Pay为用户从你的App里购买实际的物品和服务提供简单而安全的方法.通过Touch ID,用户可使用储存在iPhone ...

随机推荐

  1. APIO2019题解

    T1.桥梁(bridges/restriction) Subtask1:暴力,$O(n^2)$. #include<cstdio> #include<algorithm> #d ...

  2. 2019vivo秋招提前批笔试题第3题

    笔试的时候没做出来,就顺手截图了. 虽然知道要用动态规划做,但我一直就不太懂动态规划.笔试完又花了2小时把它做出来了.也不知道性能怎么样,但还好做出来了. def solution(n, toltal ...

  3. yii框架中的各种小问题

    1.默认路径的修改 2.分页的做法

  4. Java abstract 理解和学习

    /** * <html> * <body> * <P> Copyright JasonInternational Since 1994 https://github ...

  5. deppin Linux下安装docker

    首先楼主用的是deppin15.11 docker 简介:Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中. ...

  6. C# vb .net实现焦距淡色特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的焦距淡色效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  7. 不安全的验证码Insecure CAPTCHA

    没啥好讲的,当验证不合格时,通过burp抓包工具修改成符合要求的数据包.修改参数标志位.USER-AGENT之类的参数. 防御 加强验证,Anti-CSRF token机制防御CSRF攻击,利用PDO ...

  8. Navicat连接腾讯云服务器上的数据库

    下面介绍Navicat连接腾讯云服务器上的数据库的两种方法: 方法一:[不需要修改相关远程客户端连接权限] 点击安装好的桌面navicat图标,进入后如下图: 连接方法:ssh中输入自己服务器的外网i ...

  9. E2E测试工具之--01 Cypress 上手使用

    The web has evolved. Finally, testing has too. 1. 简介 cypress 最近很火的e2e(即end to end(端到端))测试框架,它基于node ...

  10. MySQL/MariaDB数据库的存储过程

    MySQL/MariaDB数据库的存储过程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.存储过程概述 1>.存储过程优势 存储过程把经常使用的SQL语句或业务逻辑封装起 ...