题解 P1828 【香甜的黄油 Sweet Butter】
可以使用Heap优化的Dijkstra算法
在C++中,可以利用priority_queue来实现Heap的功能
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define maxn 805
#define INF 0x7fffffff
using namespace std;
struct Edge{
int from,to,dist;
};
vector<Edge> G[maxn];
int a[maxn],d[maxn];
bool vis[maxn];
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> > Q;//优先队列
int main()
{
int n,p,c,i,x,y,z,u,j,sum=0,ans=INF;
pii w;
scanf("%d%d%d",&n,&p,&c);
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
{
scanf("%d",&x);
a[x]++;
}
for(i=1;i<=n;i++)
G[i].clear();
for(i=0;i<c;i++)
{
scanf("%d%d%d",&x,&y,&z);
G[x].push_back((Edge){x,y,z});
G[y].push_back((Edge){y,x,z});//注意到边是双向的
}
for(i=1;i<=p;i++)
{
memset(d,0x3f,sizeof(d));
memset(vis,0,sizeof(vis));
d[i]=0;
Q.push(make_pair(0,i));
while(!Q.empty())
{
u=Q.top().second;
Q.pop();
if(vis[u])continue;
vis[u]=1;
for(j=0;j<G[u].size();j++)
{
Edge &e=G[u][j];
if(d[e.to]>d[u]+e.dist)
{
d[e.to]=d[u]+e.dist;
Q.push(make_pair(d[e.to],e.to));//插入
}
}
}
sum=0;
for(j=1;j<=p;j++)
sum+=d[j]*a[j];
ans=min(ans,sum);
}
printf("%d",ans);//输出答案
return 0;
}