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. 【1】【leetcode-72 动态规划】 编辑距离

    (没思路,很典型,重要) 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替 ...

  2. 阿里巴巴 Java 开发手册 (七) 控制语句

    1. [强制]在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程 序将继续执行到哪一个 case 为止:在一个 switch 块内,都必须包含一个 ...

  3. .Net Core WebApi(2)—Swagger

    上一个版本的入门Swagger提示不够完整,这章着重完善和优化 Swagger用于将我们编写的接口自动生成规范化的文档,便于进行测试和对接    一.创建Swagger 1.1  Nuget 安装   ...

  4. angular js根据json文件动态生成路由状态

    项目上有一个新需求,就是需要根据json文件动态生成路由状态,查阅了一下资料,现在总结一下发出来: 首先项目用到的是angular的UI-路由,所以必须引入angular.js和angular-ui- ...

  5. Bootstrap-实现简单的网站首页

    html: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=" ...

  6. java static变量及函数

    java以类为基础,没有游离在类之外单独存在的变量.所以,c++中的全局变量,在java中应该是不存在的.java中有的是成员变量和成员方法.当成员前以static修饰时,即为静态成员变量或静态成员方 ...

  7. Celery:Monitor

    参考文档:http://docs.celeryproject.org/en/latest/userguide/monitoring.html#guide-monitoring

  8. iOS中copy和strong修饰符的区别

    iOS中copy和strong修饰符的区别 //用copys修饰的生成的都是不可变的对象 ,如果调用可变类型方法的直接报错 @property(nonatomic,copy)NSString * cp ...

  9. Gitlab配置webhooks实现自动化部署

    Gitlab 自动化部署 原理介绍 配置gitlab当push动作的时候,访问服务器上的一个链接比如www.shenke.group/hook.php hook.php里面写着一行代码,会让服务器gi ...

  10. MySQL Percona Toolkit--pt-osc与online DDL选择

    pt-osc和online ddl选择 1.如果表存在触发器,不能使用pt-osc.2.如果新增唯一索引,不建议使用pt-osc,以免数据丢失.3.修改索引.外键.列名时,优先选择使用ALGORITH ...