- 一本通传送门
- SPFA例题
- 由于SPFA求的是单源最短路,要枚举所有点,再用SPFA
- 顺便一提,为了SPFA简单点我用了链式前向星(是的我不会别的)
代码
#include<bits/stdc++.h>
using namespace std;
int n,p,c,x,y,z,cnt,a[1000],d[1000];
struct cyy{
int to,w,next;
}b[15000];
int h[15000];
void add(int x,int y,int z){
cnt++;
b[cnt].to=y,b[cnt].w=z,b[cnt].next=h[x];
h[x]=cnt;
}
queue<int> f;
bool s[1510];
void spfa(int q){
memset(d,0x3f,sizeof(d));
memset(s,0,sizeof(s));
d[q]=0,s[q]=1;f.push(q);
while(!f.empty()){
int t=f.front();f.pop();s[t]=0;
for(int i=h[t];i;i=b[i].next)
if(d[b[i].to]>d[t]+b[i].w){
d[b[i].to]=d[t]+b[i].w;
if(!s[b[i].to]){
s[b[i].to]=1;
f.push(b[i].to);
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&p,&c);
for(int i=1;i<=n;i++){
scanf("%d",&x);
a[x]++;
}
for(int i=1;i<=c;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
int ans=0x7fffffff;
for(int i=1;i<=p;i++){
spfa(i);
int t=0;
for(int j=1;j<=p;j++)
t+=a[j]*d[j];
ans=min(t,ans);
}
cout<<ans<<endl;
return 0;
}
|