#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <deque>
#include <list>
#include <map>
#include <iostream>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#include <climits>
using namespace std;
const int N = 1005;
const int INF = 0x7ffffff;
int n, m;
int mat[N][N],dist1[N],dist2[N];
bool vis[N];
void Init(int dist[]) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
mat[i][j] = INF;
}
}
fill(dist + 1, dist + 1 + n, INF);
memset(vis, false, sizeof(vis));
}
int Find(int dist[]) {
int pos = -1, Min = INT_MAX;
for (int i = 1; i <= n; i++) {
if (!vis[i]&&dist[i] < Min) {
Min = dist[i];
pos = i;
}
}
return pos;
}
void dijkstra(int dist[]) {
vis[1] = true;
for (int i = 1; i <= n; i++) {
int pos = Find(dist);
vis[pos] = true;
for (int j = 1; j <= n; j++) {
if (!vis[j] && mat[pos][j] < INF && dist[pos] + mat[pos][j] < dist[j]) {
dist[j] = dist[pos] + mat[pos][j];
}
}
}
}
void rebuild_mat() {
bool visit[N][N];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
visit[i][j] = false;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (!visit[i][j] && !visit[j][i]) {
int temp = mat[j][i];
mat[j][i] = mat[i][j];
mat[i][j] = temp;
visit[i][j] = true;
visit[j][i] = true;
}
}
}
}
int main(){
cin >> n >> m;
Init(dist1);
int u, v, w;
for (int i = 1; i <= m; i++) {
cin >> u >> v >> w;
mat[u][v] = w;
}
for (int i = 1; i <= n; i++) {
if (mat[1][i] < INF) {
dist1[i] = mat[1][i];
}
}
dijkstra(dist1);
int ans = 0;
for (int i = 2; i <= n; i++) {
if (dist1[i] < INF) {
ans += dist1[i];
}
}
fill(dist2 + 1, dist2 + 1 + n, INF);
memset(vis, false, sizeof(vis));
rebuild_mat();
for (int i = 1; i <= n; i++) {
if (mat[1][i] < INF) {
dist2[i] = mat[1][i];
}
}
dijkstra(dist2);
for (int i = 2; i <= n; i++) {
if (dist2[i] < INF) {
ans += dist2[i];
}
}
cout << ans;
return 0;
}
样例过了,但是仍旧爆0