栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【洛谷P3003】Apple Delivery S【Dijk+堆】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【洛谷P3003】Apple Delivery S【Dijk+堆】



L u o g u   l i n k Luogu~link Luogu link

分析:

最短路
看先走到 P A 1 PA_1 PA1​近还是 P A 2 PA_2 PA2​近 记短的距离为 d i s 1 dis1 dis1
然后分别以更近的点为起点 走到另一个点 记距离为 d i s 2 dis2 dis2
答案即 d i s 1 + d i s 2 dis1+dis2 dis1+dis2

s t l stl stl小根堆不要用 f i r s t first first存下标!!!

CODE:
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N=4e5+5;
int n,m,st,e1,e2,tot,ans;
int head[N],dis[N],vis[N];
priority_queue,vector >,greater > > q;
struct Edge{
	int to,next,k;
}a[N];
void add(int x,int y,int k)
{
	a[++tot]=(Edge){y,head[x],k};
	head[x]=tot;
}
void Dijkstra(int st)
{
	memset(dis,0x7f,sizeof dis);
	memset(vis,0,sizeof vis);
	dis[st]=0;
	q.push(make_pair(0,st));
	while(!q.empty())
	{
		int x=q.top().second;
		q.pop();
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=head[x];i;i=a[i].next)
		{
			int qwq=a[i].to;
			if(dis[qwq]>dis[x]+a[i].k)
			{
				dis[qwq]=dis[x]+a[i].k;
				if(!vis[qwq])
					q.push(make_pair(dis[qwq],qwq));
			}
		}
	}
}
int main()
{
	scanf("%d%d%d%d%d",&m,&n,&st,&e1,&e2);
	for(int i=1,x,y,k;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&k);
		add(x,y,k);
		add(y,x,k);
	}
	Dijkstra(st);
	ans=min(dis[e1],dis[e2]);
	if(ans==dis[e1])
	{
		Dijkstra(e1);
		ans+=dis[e2];
	}
	else
	{
		Dijkstra(e2);
		ans+=dis[e1];
	}
	printf("%d",ans);
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/675678.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号