dijkstra优先队列优化求调
查看原帖
dijkstra优先队列优化求调
552610
__Shine__楼主2023/7/14 15:38

自己写的,写注释是为了方便各位大佬理解qwq

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int M=5e5+10;
int n,m,tot,s,c,head[N];
int cow[1500],sum[N];
struct edge {
	int to, w,nxt;
} e[M];

inline void add(int u,int v,int w) {
	e[++tot].to = v ;
	e[tot].w = w ;
	e[tot].nxt = head[u] ;
	head[u] = tot ;
}
int main() {
	//first距离 second点号
	cin>>c>>n>>m;
	for(int i=1; i<=c; i++)cin>>cow[i];
	for(int i=1; i<=m; i++) {
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	for(s=1; s<=n; s++) {
		priority_queue< pair<int ,int> >q;//dijkstra
		bool v[N];
		int d[N];
		for(int i=1; i<=n; i++)
			d[i]=0x3f3f3f3f;
		d[s]=0;
		q.push(make_pair(0,s));
		while(q.size()) {
			int u=q.top().second;
			q.pop();
			if(v[u]) continue;
			v[u] = 1 ;
			for(int i=head[u]; i!=0; i=e[i].nxt) {
				int v=e[i].to,w=e[i].w;
				if(d[v] > d[u] + w) {
					d[v] = d[u] + w;
					q.push(make_pair(-d[v],v));
				}
			}
		}
		for(int j=1; j<=c; j++)//累加 
			sum[j]+=d[cow[j]];
	}
//	for(int j=1; j<=c; j++)
//		cout<<sum[j]<<' ';
	int minn=98244353;
	for(int i=1; i<=c; i++)
		if(minn>sum[i])
			minn=sum[i];
	cout<<minn;
	return 0;
}
2023/7/14 15:38
加载中...