Prim Algorithm
priority_queue< pair<int,int> >q;
void prim(){
d[1]=0;q.push(make_pair(0,1));
while(q.size()&&cnt<n){
int dis=-q.top().first,u=q.top().second;q.pop();
if(v[u]) continue; cnt++;tot+=dis;v[u]=1;
for(int i=lin[u];i;i=e[i].n)
if(d[e[i].y]>e[i].v)
d[e[i].y]=e[i].v,q.push(make_pair(-e[i].v,e[i].y));
}
}
Kruskal Algorithm
- Kruskal算法是一种巧妙利用并查集来求最小生成树的方法。
bool cmp(node a,node b)
{return a.v<b.v;}
int get(int x)
{return x==fa[x]? x:fa[x]=get(fa[x]);}
sort(e+1,e+m+1,cmp);
for(int i=1;i<=m;i++)
{
int x=get(e[i].x),y=get(e[i].y);
if(x==y) continue;
fa[x]=y; ans+=e[i].v;
}