记录编号 539719 评测结果 AAAAAAAAAAA
题目名称 [USACO 3.2] 香甜的黄油 最终得分 100
用户昵称 Gravatar6666 是否通过 通过
代码语言 C++ 运行时间 2.249 s
提交时间 2019-08-09 16:25:05 内存使用 16.17 MiB
显示代码纯文本
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
const int maxn=805,INF=0x3f3f3f3f;
int N,P,C,c[maxn],dis[maxn][maxn],ans=INF;
vector<int>v[maxn],w[maxn];
inline void Min(int &x,int y){
	if(x>y)x=y;
}
void Floyd(){
	for(int k=1;k<=P;k++)
	for(int i=1;i<=P;i++)if(i!=k)
	for(int j=1;j<=P;j++)if(i!=j&&j!=k)
		Min(dis[i][j],dis[i][k]+dis[k][j]);
}
struct Q{
	int x,dis;
	bool operator < (const Q &a)const{
		return dis>a.dis;
	}
};
bool vis[maxn];
void Dijkstra(int *dis,int S){
	priority_queue<Q>q;
	while(!q.empty())q.pop();dis[S]=0;
	q.push((Q){S,0});
	memset(vis,0,sizeof(vis));
	while(!q.empty()){
		Q rt=q.top();q.pop();
		if(vis[rt.x])continue;vis[rt.x]=true;
		for(int i=0;i<v[rt.x].size();i++){
			int to=v[rt.x][i];
			if(dis[to]>dis[rt.x]+w[rt.x][i]){
				dis[to]=dis[rt.x]+w[rt.x][i];
				q.push((Q){to,dis[to]});
			}
		}
	}
}
bool bein[maxn];
void Spfa(int *dis,int S){
	queue<int>q;
	while(!q.empty())q.pop();dis[S]=0;
	q.push(S);bein[S]=true;
	while(!q.empty()){
		int rt=q.front();q.pop();bein[rt]=false;
		for(int i=0;i<v[rt].size();i++){
			int to=v[rt][i];
			if(dis[to]>dis[rt]+w[rt][i]){
				dis[to]=dis[rt]+w[rt][i];
				if(!bein[to]){
					bein[to]=true;
					q.push(to);
				}
			}
		}
	}
}
int main(){
	freopen("butter.in","r",stdin);freopen("butter.out","w",stdout);
	scanf("%d%d%d",&N,&P,&C);
	for(int i=1;i<=N;i++){
		int x;scanf("%d",&x);
		c[x]++;
	}
	memset(dis,0x3f,sizeof(dis));
	for(int i=1;i<=P;i++)dis[i][i]=0;
	for(int i=1;i<=C;i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		//Min(dis[x][y],z),Min(dis[y][x],z);
		v[x].push_back(y),w[x].push_back(z);
		v[y].push_back(x),w[y].push_back(z);
	}
	//Floyd();
	for(int i=1;i<=P;i++)Dijkstra(dis[i],i);
	for(int i=1;i<=P;i++)Spfa(dis[i],i);
	for(int i=1;i<=P;i++){
		int res=0;
		for(int j=1;j<=P;j++)res+=c[j]*dis[j][i];
		Min(ans,res);
	}
	printf("%d\n",ans);
}