P3003 [USACO10DEC]Apple Delivery S

P3003 [USACO10DEC]Apple Delivery S 题解

前置知识: dijkstra 堆优化

和他的模板: 单源最短路径(标准版

题目大意:

给一个图,注意边是双向的,然后给出 s1,s2,s3s1,s2,s3 ,其中 s1s1 是起点。然后要求s1 s1s2s2 加上 s2s2s3s3s1s1s3s3 加上 s2s2s3s3 哪一个更小。

就是:

ans=min(dis[s1][s2]+dis[s2][s3],dis[s1][s3]+dis[s2][s3])ans=min(dis[s1][s2]+dis[s2][s3],dis[s1][s3]+dis[s2][s3])

所以上述式子可以转换为:

ans=min(dis[s1][s2],dis[s1][s3])+dis[s2]+[s3]ans=min(dis[s1][s2],dis[s1][s3])+dis[s2]+[s3]

(这里为了方便理解才把 disdis 写成二维数组的形式,在代码中是已经确定起点了的。)

最后需要注意 mmnn 的输入顺序。

所以代码便是:

#include<bits/stdc++.h>
using namespace std;
const int N =4000;
const int INF =1e6+10;
#define int long long
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
struct node
{
	int w,to,next;
}e[INF];
long long n,m,cnt,head[INF],dis[INF],s1,s2,s3;
bool vis[INF];
void add(int u,int v,int w)
{
	e[++cnt].to=v;
	e[cnt].w=w;
	e[cnt].next=head[u];
	head[u]=cnt;
}
void dijkstra(int x)
{
	memset(vis,0,sizeof(vis));
	memset(dis,127,sizeof(dis));
	q.push(make_pair(0,x));
	dis[x]=0;
	while(!q.empty())
	{
		int now=q.top().second;
		q.pop();
		if(vis[now])
			continue;
		vis[now]=1;
		for(int i=head[now];i;i=e[i].next)
			if(dis[now]+e[i].w<dis[e[i].to])
			{
				dis[e[i].to]=dis[now]+e[i].w;
				q.push(make_pair(dis[e[i].to],e[i].to));
			}
	}
}
signed main()
{
	cin>>m>>n>>s1>>s2>>s3;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	dijkstra(s1);
	int minn=min(dis[s2],dis[s3]);
	dijkstra(s2);
	minn+=dis[s3];
	cout<<minn<<endl;
}
posted @   June_Failure  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示