今天为大家带来最小生成树的第二种实现方式,比起kruskal来说,prim相对要复杂一些,在稠密图的表现中表现较好,最优情况下也是nlogn级别.
描述:
#include <bits/stdc++.h> #define N 999999 using namespace std; int dis[N],cnt=1,m,out,n; int now=1,totw; int head[N]; int u,v,w; struct node { int v; int next; int w; } e[N<<1]; int vis[N]; inline void add(int u,int v,int w) { e[cnt].v=v; e[cnt].next=head[u]; e[cnt].w=w; head[u]=cnt; cnt++; } inline int prim() { memset(dis,N,sizeof(dis)); for(int i=head[1]; i; i=e[i].next) { dis[e[i].v]=min(dis[e[i].v],e[i].w); } while(out!=n-1) { int minn=N; vis[now]=1; for(int i=1; i<=n; i++) { if(!vis[i]&&minn>dis[i]) { minn=dis[i]; now=i; } } totw+=minn; for(int i=head[now]; i; i=e[i].next) { int v=e[i].v; if(dis[v]>e[i].w&&!vis[v]) { dis[v]=e[i].w; } } out++; } return totw; } int main() { cin>>n>>m; for(int i=1; i<=m; i++) { cin>>u>>v>>w; add(u,v,w); add(v,u,w); } cout<<prim(); return 0; }
原文:https://www.cnblogs.com/iloveysm/p/12291808.html