#5,#7-#10 WA
代码:
#include <iostream>
#include <queue>
using namespace std;
const int nr = 1e3 + 5, mr = 1e5 + 5;
int n, m, ans;
int dis[nr];
bool vis[nr];
struct node
{
int a;
};
bool operator< (node p, node q)
{
return dis[p.a] > dis[q.a];
}
struct graph
{
int cnt;
int head[nr], nxt[mr], to[mr], len[mr];
graph()
{
cnt = 0;
for (int i = 0; i < nr; i++)
{
head[i] = 0;
}
}
void add(int u, int v, int w)
{
to[++cnt] = v;
len[cnt] = w;
nxt[cnt] = head[u];
head[u] = cnt;
}
void dijkstra()
{
for (int i = 1; i <= n; i++)
{
dis[i] = 2e9;
vis[i] = 0;
}
priority_queue<node> q;
dis[1] = 0;
node tmp;
tmp.a = 1;
q.push(tmp);
while (!q.empty())
{
int x = q.top().a;
q.pop();
if (vis[x])
{
continue;
}
vis[x] = 1;
for (int i = head[x]; i; i = nxt[i])
{
int y = to[i], w = len[i];
if (dis[x] + w < dis[y])
{
dis[y] = dis[x] + w;
node tmp2;
tmp2.a = y;
q.push(tmp2);
}
}
}
}
} g1, g2;
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
g1.add(u, v, w);
g2.add(v, u, w);
}
g1.dijkstra();
for (int i = 2; i <= n; i++)
{
ans += dis[i];
}
g2.dijkstra();
for (int i = 2; i <= n; i++)
{
ans += dis[i];
}
cout << ans;
return 0;
}