P1339 [USACO09OCT] Heat Wave G

题目描述

有一个 nnn 个点 mmm 条边的无向图,请求出从 sssttt 的最短路长度。

输入格式

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

输出格式

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

输入输出样例 #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≤25001\le n \le 25001n25001≤m≤62001\le m \le 62001m62001≤w≤10001\le w \le 10001w1000

【样例说明】
5→6→1→45 \to 6 \to 1 \to 45614 为最短路,长度为 3+1+3=73+1+3 = 73+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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

集算法之大成!助力oier实现梦想!

更多推荐