3MLE+1WA求调
查看原帖
3MLE+1WA求调
220824
yyz1005楼主2022/1/25 16:20
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int inf = 1500*1000*10;
struct Edge{
	int from;
	int to;
	int val;
	int next;
} edge[1500];
int head[1010];
int p,c,n,m,cnt = 0;
int np[1010];
int NeedSum[1010];
void AddEdge(int startp,int endp,int lineval){
	cnt++;
	edge[cnt].from = startp;
	edge[cnt].to = endp;
	edge[cnt].val = lineval;
	edge[cnt].next = head[startp];
	head[startp] = cnt;
}

struct Node{
	int id;
	int use;
	bool operator <(const Node &x) const{
		return x.use<use;
	}
};
Node make(int iid,int uuse){
	Node ret;
	ret.id = iid;
	ret.use = uuse;
	return ret;
}
int dis[1010];
bool vis[1010];
priority_queue<Node,vector<Node> > u;
void Dij(int st){
	while(!u.empty()) u.pop();
	u.push(make(st,0));
	while(!u.empty()){
		Node fir = u.top();
		u.pop();
		//printf("id:%d|len:%d\n",fir.id,fir.use);
		if(vis[fir.id]) continue;
		vis[fir.id] = true;
		dis[fir.id] = fir.use;
		for(int i = head[fir.id]; i; i = edge[i].next){
			if(!vis[edge[i].to]){
				dis[edge[i].to] = min(dis[edge[i].to],dis[fir.id]+edge[i].val);
				u.push(make(edge[i].to,dis[edge[i].to]));
			}
		}
	}
}

int main(){
	cin >> n >> p >> c;
	for(int i = 1; i <= n; i++){
		cin >> np[i];
	}
	int cnt = 0;
	for(int i = 1; i <= c; i++){
		int a,b,d;
		cin >> a >> b >> d;
		AddEdge(a,b,d);
		AddEdge(b,a,d);
	}
	m = cnt*2;
	//cout << "right\n";
	//cout << n << " " << p << endl;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= p; j++){
			dis[j] = inf;
			vis[j] = false;
		}
		Dij(np[i]);
		for(int j = 1; j <= p; j++){
			//printf("从%d到%d的最短路:%d\n",np[i],j,dis[j]);
			NeedSum[j]+=dis[j];
		}
	}
	int MIN = 1000*1500*250;
	for(int i = 1; i <= p; i++){
		//cout << i<< " " << NeedSum[i] << endl;
		MIN = min(MIN,NeedSum[i]);
	}
	cout << MIN;
	return 0;
}
2022/1/25 16:20
加载中...