#include<bits/stdc++.h>
#define ll long long
#define maxm 60050
#define maxn 20050
#define inf LONG_MAX
using namespace std;
int n, m, k;
ll w[maxm], ans, dis[maxn];
int head[maxn], u[maxm], v[maxm];
struct Edge{
int u, v, next;
ll w;
}edge[maxm];
void addEdge(int u, int v, ll w){
edge[k].u = u, edge[k].v = v, edge[k].w = w;
edge[k].next = head[u];
head[u] = k++;
}
void spfa(int x){
for(int i=1; i<=n; i++)
dis[i] = inf;
queue<int> que;
que.push(x);
dis[x] = 0;
while(que.size()){
int t = que.front();
que.pop();
for(int i=head[t]; i!=-1; i=edge[i].next){
if(dis[edge[i].v] > dis[t] + edge[i].w){
dis[edge[i].v] = dis[t] + edge[i].w;
que.push(edge[i].v);
}
}
}
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n>>m;
ans = 0;
for(int i=1; i<=n; i++)
head[i] = -1;
k = 0;
for(int i=1; i<=m; i++){
scanf("%d %d %lld", &u[i], &v[i], &w[i]);
addEdge(u[i], v[i], w[i]);
}
spfa(1);
for(int i=1; i<=n; i++)
ans += dis[i];
for(int i=1; i<=n; i++)
head[i] = -1;
k = 0;
for(int i=1; i<=m; i++)
addEdge(v[i], u[i], w[i]);
spfa(1);
for(int i=1; i<=n; i++)
ans += dis[i];
cout<<ans<<endl;
}
return 0;
}
最短路 SPFA 2020 蓝桥杯省赛 B 组模拟赛(一)
猜你喜欢
转载自blog.csdn.net/weixin_43708069/article/details/105304164
今日推荐
周排行