《挑战程序设计竞赛》中对最小生成树中的prim算法只给出了未优化形式,而对于堆优化,只是简单地分析了时间复杂度,而对于堆优化问题,网上的答案不多,因此手写一份堆优化代码模板(理解后可直接使用)
//maxV是顶点最大数
typedef pair<int, int>P;
struct Edge
{
int to, cost;
};
vector<Edge>edge[maxV];
int V;
int mincost[maxV];
bool vis[maxV];
void prim()
{
priority_queue<P, vector<P>, greater<P> >que;
fill(mincost, mincost + V, inf);
memset(vis, false, sizeof(vis));
int ans = 0;
mincost[0] = 0;
que.push(P(0, 0));
while(!que.empty())
{
P p = que.top();
que.pop();
int v = p.second;
vis[v] = true;
if(mincost[v] < p.first)
continue;
for(int i = 0; i < edge[v].size(); i++)
{
Edge e = edge[v][i];
if(!vis[e.to] && mincost[e.to] > e.cost)
{
ans += e.cost;
if(mincost[e.to] != inf)
ans -= mincost[e.to];
mincost[e.to] = e.cost;
que.push(P(mincost[e.to], e.to));
}
}
}
printf("%d\n", ans);
}