#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
#define int long long
struct Edge
{
int next;
int to;
int dis;
};
struct node
{
int num;
int val;
bool operator < (const node &a) const
{
return a.val < val;
}
};
int n, m;
Edge e1[2003], e2[2003];
int head1[1003], head2[1003];
int num_edge1, num_edge2;
int dis1[1003], dis2[1003];
int vis1[1003], vis2[1003];
priority_queue<node> q;
void add_edge(int u, int v, int w, int p)
{
if(p == 1) // 建正边
{
num_edge1++;
e1[num_edge1].to = v;
e1[num_edge1].dis = w;
e1[num_edge1].next = head1[u];
head1[u] = num_edge1;
}
else // 建反边
{
num_edge2++;
e2[num_edge2].to = v;
e2[num_edge2].dis = w;
e2[num_edge2].next = head2[u];
head2[u] = num_edge2;
}
return;
}
void dijkstra1() // 遍历正边
{
dis1[1] = 0;
q.push((node){1, 0});
while(q.size())
{
node tmp = q.top();
q.pop();
if(vis1[tmp.num])
{
continue;
}
vis1[tmp.num] = 1;
for(int i = head1[tmp.num]; i; i = e1[i].next)
{
int to = e1[i].to;
int diss = e1[i].dis;
if(dis1[to] > diss + dis1[tmp.num])
{
dis1[to] = diss + dis1[tmp.num];
if(!vis1[to])
{
q.push((node){to, dis1[to]});
}
}
}
}
}
void dijkstra2() // 遍历反边
{
dis2[1] = 0;
q.push((node){1, 0});
while(q.size())
{
node tmp = q.top();
q.pop();
if(vis2[tmp.num])
{
continue;
}
vis2[tmp.num] = 1;
for(int i = head2[tmp.num]; i; i = e2[i].next)
{
int to = e2[i].to;
int diss = e2[i].dis;
if(dis2[to] > diss + dis2[tmp.num])
{
dis2[to] = diss + dis2[tmp.num];
if(!vis2[to])
{
q.push((node){to, dis2[to]});
}
}
}
}
}
signed main()
{
memset(dis1, 0x3f, sizeof(dis1));
memset(dis2, 0x3f, sizeof(dis2));
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
add_edge(u, v, w, 1);
add_edge(v, u, w, 2);
}
dijkstra1();
dijkstra2();
int ans = 0;
for(int i = 1; i <= n; i++)
{
ans += dis1[i] + dis2[i];
}
cout << ans << endl;
return 0;
}
4RE+2TLE,没调出来。麻烦大佬看一下哪里错了,感谢!