感觉我的算法思维没啥问题啊
各位大佬帮忙看看
#include<bits/stdc++.h>
#define N 505
#define PP 805
#define C 1455
using namespace std;
int n,p,c,cow[N],ans=0x3f,cnt=0;
int dis[N][PP];//mn[i][j]表示第i头牛到第j个农场的最小值
struct P{
int to,w,next;
}pi[C];
int head[PP],tot=0;
bool vis[PP];
void add(int x,int y,int z){
++tot;
pi[tot].to=y;
pi[tot].w=z;
pi[tot].next=head[x];
head[x]=tot;
}
queue<int > q;
void ot(){
while(q.size())
q.pop();
}
void spfa(int num){
int s=cow[num];
memset(vis,0,sizeof(vis));
ot();//清空队列
dis[num][s]=0;
vis[s]=0;
q.push(s);
while(q.size()){
int x=q.front();
q.pop();
vis[x]=0;
for(int i=head[x];i;i=pi[i].next){
int y=pi[i].to,z=pi[i].w;
if(dis[num][y]>dis[num][x]+z){
dis[num][y]=dis[num][x]+z;
if(!vis[y]){
q.push(y);
vis[y]=1;
}
}
}
}
}
int main(){
memset(dis,0x3f,sizeof(dis));
int u,v,w;
scanf("%d%d%d",&n,&p,&c);
for(int i=1;i<=n;i++)
scanf("%d",&cow[i]);
for(int i=1;i<=c;i++){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
for(int i=1;i<=n;i++)//枚举每一头牛
spfa(i);
for(int i=1;i<=p;i++){//以每一个农场作为终点
cnt=0;
for(int j=1;j<=n;j++){//枚举每一头牛
cnt+=dis[j][i];
}
ans=min(ans,cnt);
}
printf("%d",ans);
return 0;
}