以每一个点作为源点进行最短路计算,然后累加统计有牛的顶点的最短路和取其最小值,复杂度为O(pke)=21500*800=2.4 *10^6
#include<bits/stdc++.h>
using namespace std;
const int N=5e3;
const int INF=0x3f3f3f3f;
int n,p,m,dis[N],head[N],nxt[N],ver[N],edg[N],c[N],tot,v[N],ans;
void add(int x,int y,int z){
ver[++tot]=y;
edg[tot]=z;
nxt[tot]=head[x];
head[x]=tot;
}
void spfa(int x){
queue<int>q;
memset(dis,0x7f,sizeof dis);
memset(v,0,sizeof v);
dis[x]=0;
q.push(x);
v[x]=1;
while(q.size()){
int t=q.front();
q.pop();
v[t]=0;
for(int i=head[t];i;i=nxt[i]){
int y=ver[i],z=edg[i];
if(dis[y]>dis[t]+z){
dis[y]=dis[t]+z;
if(!v[y]){
q.push(y);
v[y]=1;
}
}
}
}
}
int main(){
cin>>n>>p>>m;
ans=INF;
for(int i=1;i<=n;i++)
cin>>c[i];
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
for(int i=1;i<=p;i++){
spfa(i);//对每一个作为源点进行最短路计算
int tmp=0;
// cout<<"i"<<i<<" ";
for(int j=1;j<=n;j++)
if(c[j]){
tmp+=dis[c[j]];//只有有牛的地方才需要累加其最短路
// cout<<dis[c[j]]<<" ";
}
//cout<<endl;
ans=min(ans,tmp); //取最小的值
}
cout<<ans<<endl;
return 0;
}