prim和kruskal算法
//邻接矩阵 int n,G[MAXV][MAXN]; int d[MAXV];//表示到树的距离 bool vis[MAXV]={false}; int prim(){ fill(d,d+MAXV,INF); d[0]=0; int ans=0; for(int i=0;i<n;i++){ int u=-1;MIN=INF; for(int j=0;j<n;j++){ if(vis[j]==false&&d[j]<MIN){ u=j; MIN=d[j];//dj一个套路 } } if(u==-1) return -1; vis[u]=true; ans+=d[u]; for(int v=0;v<n;v++){ if(vis[v]==false&&G[u][v]!=INF&&G[u][v]<d[v]){ d[v]=G[u][v]; } } } return ans; } //邻接表 struct Node{ int v,dis; }; vector<Node>Adj[MAXV]; int n,d[mAXV]; bool vis[MAXV]={false}; int prim(){ fill(d,d+MAXV,INF); d[0]=0; int ans=0; for(int i=0;i<n;i++){ int u=-1,MIN=INF; for(int j=0;j<n;j++){ if(vis[j]==false&&d[j]<MIN){ u=j; MIN=d[j]; } } if(u==-1) return -1; vis[u]=true; ans+=d[u]; for(int j=0;j<Adj[u].size();j++){ int v=Adj[u][j].v; if(vis[v]==false&&Adj[u][j].dis<d[v]){ d[v]=G[u][v]; } } } return ans; }
和dj一个套路,不同点就是d[MAXV]在dj中表示到起点的最短路径,但是在prim中表示的是到树的最小距离
kruskal算法采用的是边贪心思想,时间复杂度是ElogE,E表示边数,所以该算法适合顶点多而边数少的情况,这与prim算法相反,所以稠密图用prim稀疏图用kruskal