prim模板(hihocoder1097,不带优化,时间复杂度为O(n*n)):
int n,mat[maxn][maxn],d[maxn],vis[maxn];
int ans,End;
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
scanf("%d",&mat[i][j]);
}
}
memset(d,0x3f3f3f,sizeof(d));
memset(vis,0,sizeof(vis));
d[1] = 0;
ans = 0;
for(int i = 1;i <= n;i++){
End = -1;
for(int j = 1;j <= n;j++){
if(!vis[j]&&(End == -1||d[End] > d[j]))
End = j;
}
ans += d[End];
vis[End] = 1;
for(int j = 1;j <= n;j++){
if(!vis[j]&&d[j] > mat[End][j])
d[j] = mat[End][j];
}
}
printf("%d\n",ans);
}
kruskal(hihocoder1098,时间复杂度为O(MlogM + M * Ackermann’(M))):
int pre[maxn];
struct edge{
int from,to,val;
}Edge[maxn];
bool cmp(edge x,edge y){
return x.val < y.val;
}
int Find(int x){
return x == pre[x]?x:pre[x] = Find(pre[x]);
}
void Union(int x,int y){
pre[Find(x)] = Find(y);
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i = 0;i <= n;i++) pre[i] = i;
for(int i = 1;i <= m;i++){
scanf("%d%d%d",&Edge[i].from,&Edge[i].to,&Edge[i].val);
}
sort(Edge+1,Edge+1+m,cmp);
int ans = 0;
for(int i = 1;i <= m;i++){
if(Find(Edge[i].from) != Find(Edge[i].to)){
Union(Edge[i].from,Edge[i].to);
ans += Edge[i].val;
}
}
printf("%d\n",ans);
return 0;
}
使用堆优化的prim(hihocoder1109,时间复杂度O(mlogm))
typedef pair<int,int>p;
vector<p >vec[maxn];
int vis[maxn];
int main(){
int n,m,u,v,val;
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
for(int i = 1;i <= m;i++){
scanf("%d%d%d",&u,&v,&val);
vec[u].push_back(p(val,v));
vec[v].push_back(p(val,u));
}
priority_queue<p,vector<p>,greater<p> >pq;
vis[1] = 1;
for(int i = 0;i < vec[1].size();i++){
pq.push(vec[1][i]);
}
int ans = 0;
while(!pq.empty()){
p now = pq.top();
pq.pop();
if(!vis[now.second]){
vis[now.second] = 1;
ans += now.first;
for(int i = 0;i < vec[now.second].size();i++){
if(!vis[vec[now.second][i].second])
pq.push(vec[now.second][i]);
}
}
}
printf("%d\n",ans);
}