校内训练2019-11-15表演
Posted chhokmah
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了校内训练2019-11-15表演相关的知识,希望对你有一定的参考价值。
【题目概括】
给定一个无向带权图,每一个点都有一个点权。
对于每一个点都询问从某一个点(x)到这个点的最短距离+(x)的点权最小值。
【思路要点】
- 将每一个点的权值当前一开始的距离(dis)。
- 把所有点都当做起点,跑一遍最短路就可以了。
【代码】
#include <bits/stdc++.h>
#define REP(i, s, t) for (int i = s; i <= t; i++)
#define PER(i, s, t) for (int i = s; i >= t; i--)
#define FI first
#define SE second
#define mp make_pair
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
template <class T>
void chkmax(T& x, T y) {
x = max(x, y);
}
template <class T>
void chkmin(T& x, T y) {
x = min(x, y);
}
template <class T>
void re(T& x) {
x = 0;
char ch = 0;
int f = 1;
for (; !isdigit(ch); ch = getchar())
if (ch == '-')
f = -1;
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
x *= f;
}
template <class T>
void pr(T x) {
if (x < 0)
putchar('-'), x = -x;
if (x > 9)
pr(x / 10);
putchar(x % 10 + 48);
}
const int N = 2e5 + 5;
struct _edge {
int to, nt;
ll w;
} E[N << 1];
struct Node {
int u;
ll d;
bool operator<(const Node& rhs) const { return d > rhs.d; }
};
int n, m, edgeCnt;
int H[N];
ll dis[N];
bool vis[N];
void addEdge(int u, int v, ll w) {
E[++edgeCnt] = (_edge){ v, H[u], w };
H[u] = edgeCnt;
}
priority_queue<Node> q;
void dij() {
memset(vis, 0, sizeof vis);
for (int i = 1; i <= n; i++) q.push((Node){ i, dis[i] });
while (!q.empty()) {
int u = q.top().u;
q.pop();
if (vis[u])
continue;
vis[u] = 1;
for (int e = H[u]; e; e = E[e].nt) {
int v = E[e].to, w = E[e].w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push((Node){ v, dis[v] });
}
}
}
}
int main() {
freopen("exciting.in", "r", stdin);
freopen("exciting.out", "w", stdout);
re(n), re(m);
for (int i = 1; i <= m; i++) {
int u, v;
ll w;
re(u), re(v), re(w);
w <<= 1;
addEdge(u, v, w), addEdge(v, u, w);
}
for (int i = 1; i <= n; i++) re(dis[i]);
dij();
for (int i = 1; i <= n; i++) pr(dis[i]), putchar(' ');
return 0;
}
以上是关于校内训练2019-11-15表演的主要内容,如果未能解决你的问题,请参考以下文章