只wa了附加点
查看原帖
只wa了附加点
1206518
Nervegas楼主2024/7/12 13:24
#include<bits/stdc++.h>
using namespace std;
#define inf32 INT32_MAX / 2
const int N = 500010;

struct edge{
	int to;
	int dis;
	edge(int a,int b){
		to = a;
		dis = b;
	}
};
vector<edge> g[N];
int n,p,c;
queue<int> que;
int dis[N];
int v[N];//是否在队列里; 
int a[N];

void spfa(int s){
	memset(v,0,sizeof(v));
	memset(dis,0x3f,sizeof(dis));
	dis[s] = 0;
	que.push(s);
	v[s] = 1;
	while(!que.empty()){
		int x = que.front();
		que.pop();
		v[x] = 0;
		for(int i = 0 ; i < g[x].size() ; i++){
			int y = g[x][i].to;
			int w = g[x][i].dis;
			if(dis[y] > dis[x] + w){
				dis[y] = dis[x] + w;
				if(!v[y]){
					que.push(y);
					v[y] = 1;
				}
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin >> n >> p >> c;
	for(int i = 1 ; i <= n ; i++){
		cin >> a[i];
	}
	for(int i = 1 ; i <= c ; i++){
		int a,b,d;
		cin >> a >> b >> d;
		g[a].push_back(edge(b,d));
		g[b].push_back(edge(a,d)); 
	}
	int minn = 
	for(int i = 1 ; i <= p ; i++){
		spfa(i);//计算以每一个点作为起点的最短路径,对总和取最小; 
		int ans = 0;
		for(int j = 1 ; j <= n ; j++){
			ans += dis[a[j]];
		}
		minn = min(minn,ans);
	}
	cout << minn << endl;
	return 0;
}
2024/7/12 13:24
加载中...