Kruskal算法
int fa[maxn];
struct edge
{
int u,v,w;
}E[maxn];
bool cmp(const edge &a,const edge &b){return a.w<b.w;}
void merge(int u,int v){fa[find(u)]=find(v);}
int find(int u){return fa[u]==u?u:fa[u]=find(fa[u]);}
int kruskal()
{
sort(E+1,E+m+1,cmp);
for(int i=1;i<=n;i++)fa[i]=i;
int ans=0;
for(int i=1;i<=m;i++)
{
int u=E[i].u,v=E[i].v,w=E[i].w;
if(find(u)==find(v))
continue;
merge(u,v);
ans+=w;
}
return ans;
}
Prim算法
int prim()
{
for(int i=1;i<=n;i++)
{
dis[i]=inf;
pre[i]=0;
vis[i]=0;
}
vis[1]=1;
dis[1]=0;
int ans=0;
for(int i=1;i<=n;i++)
{
int u=0,mn=inf;
for(int j=1;j<=n;j++)
if(!vis[j]&&mn>dis[j])
{
mn=dis[j];
u=j;
}
vis[u]=1;
ans+=mn;
for(int v=1;v<=n;v++)
if(!vis[v]&&g[u][v]<dis[v])
{
pre[v]=u;
dis[v]=g[u][v];
}
}
return ans;
}
在稀疏图中邻接矩阵不够划算
可以用邻接表代替
而且,可以用优先队列存权
可升级为:
bool vis[maxn];
struct node
{
int v,w;
node (int v=0,int w=0):v(v),w(w){};
bool operator<(node x)const
{
return w>x.w;
}
}
vector<node>G[maxn];
void add_edge(int u,int v,int w)
{
node x;
x.w=w;
x.v=v;
G[u].push_back(x);
}
int prim()
{
priority_queue<node>Q;
Q.push(node(1,0));
int ans=0;
vis[1]=1;
while(!Q.empty())
{
node u=Q.top();
Q.pop();
if(vis[u.v])continue;
ans+=u.w;
vis[u.v]=1;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i].v;
int w=G[u][i].w;
if(!vis[v])Q.push(node(v,w));
}
}
return ans;
}