1 条题解
-
0
自动搬运
来自洛谷,原作者为

寒鸽儿
寒鸽儿gugugu~搬运于
2025-08-24 21:27:17,当前版本为作者最后更新于2020-01-18 14:35:17,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
dijkstra的裸题吧。
正着走过去的时候用一便dijkstra。
返回时就建个返图跑一遍dijkstra。
反图可以把所有结点的编号建在原图的体系中。#include <cstdio> #include <cstring> #include <queue> #define ll long long using namespace std; const int maxn = 1234, maxm = 123456; ll inf = 9000000000000000; int head[maxn << 1], ver[maxm << 1], wei[maxm << 1], nex[maxm << 1], tot, n; void addedge(int u, int v, int w) { ver[tot] = v; wei[tot] = w; nex[tot] = head[u]; head[u] = tot++; } struct nodeq { int x; ll dis; nodeq(int X, ll DIS) : x(X), dis(DIS) {} bool operator > (const nodeq& o) const { return dis > o.dis; } }; priority_queue< nodeq, vector<nodeq>, greater<nodeq> > q; ll dis[maxn << 1]; void dij(int s) { for(int i = 1; i <= n << 1; ++i) dis[i] = inf; dis[s] = 0; q.push(nodeq(s, 0)); while(!q.empty()) { nodeq cur = q.top(); q.pop(); if(dis[cur.x] < cur.dis) continue; for(int i = head[cur.x]; ~i; i = nex[i]) { if(dis[ver[i]] > cur.dis + wei[i]) { dis[ver[i]] = cur.dis + wei[i]; q.push(nodeq(ver[i], dis[ver[i]])); } } } } int main() { memset(head, -1, sizeof(head)); int m, u, v, w; ll ans = 0; scanf("%d %d", &n, &m); for(int i = 1; i <= m; ++i) { scanf("%d %d %d", &u, &v, &w); addedge(u, v, w); addedge(v + n, u + n, w); } dij(1); for(int i = 2; i <= n; ++i) ans += dis[i]; dij(1 + n); for(int i = 2 + n; i <= n << 1; ++i) ans += dis[i]; printf("%lld\n", ans); return 0; }
- 1
信息
- ID
- 622
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者