#include<stdio.h>
#include<memory.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<algorithm>
#include<math.h>
#include<queue>
#define MAX 100000000
using namespace std;
typedef long long ll;
int n;
struct Edge{
int x;
int y;
ll w;
int next;
friend bool operator<(Edge a,Edge b){
return a.w>b.w;//小数据优先
}
};
int head[105];
Edge e[10050];
bool used[105];
ll ans;
void inserte(int k,int x,int y,ll w){
e[k].x=x;
e[k].y=y;
e[k].w=w;
e[k].next=head[x];
head[x]=k;
}
void prim_opt(int sp){
priority_queue<Edge> q;
for(int i=head[sp];i!=-1;i=e[i].next){
q.push(e[i]);
}
vector<int> ar;
ar.push_back(sp);
used[sp]=1;
ans=0;
while(ar.size()<n){
while(used[q.top().y])q.pop();
Edge now=q.top();
q.pop();
ans+=now.w;
used[now.y]=1;
for(int i=head[now.y];i!=-1;i=e[i].next){
if(!used[e[i].y])q.push(e[i]);
}
ar.push_back(now.y);
}
}
int main(){
while(~scanf("%d",&n)){
if(n==0)break;
memset(head,-1,sizeof(head));
memset(used,0,sizeof(used));
ans=0;
int a,b,p;
int k=0;
for(int i=1;i<=n*(n-1)/2;i++){
scanf("%d%d%d",&a,&b,&p);
inserte(k,a,b,p);k++;
inserte(k,b,a,p);k++;
}
prim_opt(1);
printf("%lld\n",ans);
}
return 0;
}
使用优先队列优化
优化后运行时间几乎减少一半,但跟Kruskal差不多