题目如下
思路
使用Dijkstra 算法,模板题
下面是模板套用(记得存边要存两个)
struct edge {
int v, w;
};
struct node {
int dis, u;
bool operator>(const node& a) const { return dis > a.dis; }
};
vector<edge> e[maxn];
int dis[maxn], vis[maxn];
priority_queue<node, vector<node>, greater<node> > q;
void dijkstra(int n, int s) {
memset(dis, 63, sizeof(dis));
dis[s] = 0;
q.push({0, s});
while (!q.empty()) {
int u = q.top().u;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (auto ed : e[u]) {
int v = ed.v, w = ed.w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push({dis[v], v});
}
}
}
}
题目代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200006;
long long txt;
struct edge {
long long v, w;
};
struct node {
long long dis, u;
bool operator>(const node &a) const {
return dis > a.dis;
}
};
vector<edge> e[maxn];
long long dis[maxn], vis[maxn];
priority_queue<node, vector<node>, greater<node>> q;
void dijkstra(long long n, long long s) {
memset(dis, 31, sizeof(dis));
txt = dis[s];
dis[s] = 0;
q.push({0, s});
while (!q.empty()) {
long long u = q.top().u;
q.pop();
if (vis[u])
continue;
vis[u] = 1;
for (auto ed : e[u]) {
long long v = ed.v, w = ed.w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push({dis[v], v});
}
}
}
}
int main() {
long long n, m, s, t;
scanf("%lld%lld%lld%lld", &n, &m, &s, &t);
for (int i = 0; i < m; i++) {
long long u, v, w;
scanf("%lld%lld%lld", &u, &v, &w);
e[u].push_back({v, w});
e[v].push_back({u, w});
}
dijkstra(n, s);
// for (int i = 1; i <= n; i++)
printf("%lld ", dis[t]);
}