//邻接矩阵
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