P3003 [USACO10DEC]Apple Delivery S
P3003 [USACO10DEC]Apple Delivery S 题解
前置知识: dijkstra 堆优化
和他的模板: 单源最短路径(标准版
题目大意:
给一个图,注意边是双向的,然后给出 ,其中 是起点。然后要求 到 加上 到 和 到 加上 到 哪一个更小。
就是:
所以上述式子可以转换为:
(这里为了方便理解才把 写成二维数组的形式,在代码中是已经确定起点了的。)
最后需要注意 和 的输入顺序。
所以代码便是:
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现