打卡信奥刷题(986)用C++实现信奥 P1339 [USACO09OCT] Heat Wave G

P1339 [USACO09OCT] Heat Wave G

题目描述

有一个 n n n 个点 m m m 条边的无向图,请求出从 s s s t t t 的最短路长度。

输入格式

第一行四个正整数 n , m , s , t n,m,s,t n,m,s,t
接下来 m m m 行,每行三个正整数 u , v , w u,v,w u,v,w,表示一条连接 u , v u,v u,v,长为 w w w 的边。

输出格式

输出一行一个整数,表示答案。

输入输出样例 #1

输入 #1

7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1

输出 #1

7

说明/提示

【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 2500 1\le n \le 2500 1n2500 1 ≤ m ≤ 6200 1\le m \le 6200 1m6200 1 ≤ w ≤ 1000 1\le w \le 1000 1w1000

【样例说明】
5 → 6 → 1 → 4 5 \to 6 \to 1 \to 4 5614 为最短路,长度为 3 + 1 + 3 = 7 3+1+3 = 7 3+1+3=7

C++实现

#include<bits/stdc++.h>
using namespace std;
const int maxn=2505;
#define INF 1e9
vector<pair<int,int> >e[maxn];
int d[maxn];
void dijkstra(int s){
priority_queue<pair<int,int> >q;//大根堆
d[s]=0;
q.push(make_pair(-d[s],s));
while(!q.empty()){
int now=q.top().second;
q.pop();
for(int i=0;i<e[now].size();i++) {
int v=e[now][i].first;
if(d[v]>d[now]+e[now][i].second) {//松弛
d[v]=d[now]+e[now][i].second;
q.push(make_pair(-d[v],v));
}
}
}
}
int main() {
int n,m,s,t;
scanf(“%d%d%d%d”,&n,&m,&s,&t);
for(int i=0;i<maxn;i++)e[i].clear(),d[i]=INF;
for(int i=1;i<=m;i++) {//建图
int u,v,d;
scanf(“%d%d%d”,&u,&v,&d);
e[u].push_back(make_pair(v,d));
e[v].push_back(make_pair(u,d));
}
dijkstra(s);
printf(“%d\n”,d[t]);
return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值