最短路 SPFA 2020 蓝桥杯省赛 B 组模拟赛(一)

#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;
}
发布了46 篇原创文章 · 获赞 1 · 访问量 2390

猜你喜欢

转载自blog.csdn.net/weixin_43708069/article/details/105304164