/* Prim(G,d[]) { 初始化; for(执行n次) { u=使得d[u]最小且还没有访问的定点的编号; 记录对u的访问; for(从u出发能够到达的所有顶点v) { if(v没有访问 && 以u为中介点使得v和集合s的最短距离d[v]更优) { 将G[u][v]赋值给v与集合s的最短距离d[v]; } } } } */ //邻接矩阵实现 const int MAXV = 1000; const int INF = 0xFFFFFFF; int n,G[MAXV][MAXV]; 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) { MIN=d[j]; u=j; } } if(u==-1) return -1; vis[u]=true; 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]; 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; int dis = Adj[u][j].dis; if(vis[v]==false && dis<d[v]) { d[v]=dis; //ans+=d[v];此处不可以累加 } } } }