R.T
实际由于没有UVA账号,我做的是另一道一模一样的题
(话说这几道题恶评也太严重了吧,这两道题就是P1342简单加了个循环啊喂)
不过能水几道蓝题还是很香的
P1342我已经AC,这道题我就是用了P1342的代码改了一小点,但WA了
代码:
#include <bits/stdc++.h>
using namespace std;
int n, m, cnt;
long long ans;
int head[5000010], dis[5000010];
int U[5000010], V[5000010], W[5000010];
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;
template <typename _Ip>
inline void read(_Ip &x) {
char ch = getchar(), sgn = 0; x = 0;
while (ch ^ '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') ch = getchar(), sgn = 1;
while (isdigit(ch)) x = (x<<3)+(x<<1) + (ch^48), ch = getchar();
if (sgn) x = -x;
}
template <typename _Op>
inline void write(_Op x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
struct Edge {
int to;
int next;
int w;
} edge[5000010];
inline void add(int u, int v, int w) {
edge[++cnt].to = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
void Dijkstra(int pos) {
memset(dis, 0x3f, sizeof(dis));
dis[pos] = 0;
q.push(make_pair(0, pos));
while (!q.empty()) {
int x = q.top().first, u = q.top().second;
q.pop();
if (dis[u] != x) continue;
for (int i = head[u]; i; i = edge[i].next) {
if (dis[edge[i].to] > dis[u] + edge[i].w) {
dis[edge[i].to] = dis[u] + edge[i].w;
q.push(make_pair(dis[edge[i].to], edge[i].to));
}
}
}
}
void clears() {
ans = 0;
n = 0;
m = 0;
cnt = 0;
memset(U, 0, sizeof(U));
memset(V, 0, sizeof(V));
memset(W, 0, sizeof(W));
}
int main() {
int t;
read(t);
while (t--) {
read(n);read(m);
for (int i = 1; i <= m; ++i) {
read(U[i]);read(V[i]);read(W[i]);
add(U[i], V[i], W[i]);
}
Dijkstra(1);
for (int i = 1; i <= n; ++i) {
ans += dis[i];
}
cnt = 0;
memset(head, 0, sizeof(head));
for (int i = 1; i <= m; ++i) {
add(V[i], U[i], W[i]);
}
Dijkstra(1);
for (int i = 1; i <= n; ++i) {
ans += dis[i];
}
write(ans);
putchar('\n');
//clears();
ans = 0;
}
return 0;
}
是真的不知道哪错了,救救孩子吧