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 ...
随机推荐
- ELK +Nlog 分布式日志系统的搭建 For Windows
前言 我们为啥需要全文搜索 首先,我们来列举一下关系型数据库中的几种模糊查询 MySql : 一般情况下LIKE 模糊查询 SELECT * FROM `LhzxUsers` WHERE UserN ...
- 玩转dockerfile
镜像的缓存特性 Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建. 举例说明.在前面的 Dockerfile 中添加一点新内容,往镜像中复制一个文件: ...
- 【高并发解决方案】8、Nginx/LVS/HAProxy负载均衡软件的优缺点详解
PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...
- spring 中的 bean 是线程安全的吗?
spring 中的 bean 是线程安全的吗? Spring 不保证 bean 的线程安全. 默认 spring 容器中的 bean 是单例的.当单例中存在竞态条件,即有线程安全问题.如下面的例子 计 ...
- 爬虫之scrapy框架应用selenium
一.利用selenium 爬取 网易军事新闻 使用流程: ''' 在scrapy中使用selenium的编码流程: 1.在spider的构造方法中创建一个浏览器对象(作为当前spider的一个属性) ...
- Python面向对象三要素-封装(Encapsulation)
Python面向对象三要素-封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装概述 将数据和操作组织到类中,即属性和方法 将数据隐藏起来,给 ...
- 微信小程序~下拉刷新真机测试不弹回的处理办法
问题描述: 下拉刷新在手机上不会自动回弹,开发工具可以 解决办法: 主动调用wx.stopPullDownRefresh /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDow ...
- el-table 多列显示隐藏造成内容错乱
- Oracle锁表与解锁 对象锁与解锁
阅读目录 锁表与解锁 查看锁表进程SQL语句 解锁 对象锁与解锁 回到顶部 锁表与解锁 查看锁表进程SQL语句 select * from v$session t1, v$locked_object ...
- P1197 [JSOI2008]星球大战[并查集+图论]
题目来源:洛谷 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球 ...