前三个点WA了 (全WA或TLE反倒更好改
链式前向星存图的dijkstra,开了longlong
真找不出来错哪里了QAQ
跪求大佬指出错的地方OTL
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1000005;
const int M = 1000005;
const ll INF = LONG_LONG_MAX;
struct node {
int to, nxt, val;
} e[M], de[M];
int n, m;
ll ans;
int head1[N], head2[N];
ll dis[N];
bool vis[N];
priority_queue<int, vector<int>, greater<int>> q;
void addEdge(int u, int v, int w) {
static int cnt = 1;
e[cnt].val = w;
e[cnt].to = v;
e[cnt].nxt = head1[u];
head1[u] = cnt++;
}
void addEdge1(int u, int v, int w) {
static int cnt1 = 1;
de[cnt1].val = w;
de[cnt1].to = v;
de[cnt1].nxt = head2[u];
head2[u] = cnt1++;
}
void Dijkstra(int *h, node *edge) {
//
for (int i = 1; i <= n; i++) {
dis[i] = INF;
vis[i] = false;
}
dis[1] = 0;
q.push(1);
//
while (!q.empty()) {
int u = q.top();
q.pop();
if (vis[u]) continue;
vis[u] = true;
for (int i = h[u]; i; i = edge[i].nxt) {
int v = edge[i].to, w = edge[i].val;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push(v);
}
}
}
//
for (int i = 1; i <= n; i++){
if (dis[i] != INF)
ans += dis[i];
}
}
int main() {
//
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
addEdge(x, y, z);
addEdge1(y, x, z);
}
//
Dijkstra(head1, e);
Dijkstra(head2, de);
//
printf("%lld\n", ans);
return 0;
}