#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
const int inf=0x3f3f3f3f;
typedef struct
{
int to,cost,next;
}node;
node edge[maxn*2];
int cnt,pre[maxn],dis[maxn],vis[maxn];
struct cmp
{
bool operator() (int &a, int &b)const{
return dis[a] > dis[b];
}
};
void prim()
{
int res=0;
priority_queue<int,vector<int>,cmp> que;
dis[1]=0;
vis[1]=1;
que.push(1);
while(que.size())
{
int now=que.top();
que.pop();
res+=dis[now];
dis[now]=0;
for(int i=pre[now];i!=-1;i=edge[i].next)
{
int tp=edge[i].to;
dis[tp]=min(dis[tp],edge[i].cost);
if(vis[tp])
{
queue<int> quee;
while(que.size())
{
quee.push(que.top());
que.pop();
}
while(quee.size())
{
que.push(quee.front());
quee.pop();
}
continue;
}
que.push(tp);
vis[tp]=1;
}
}
printf("%d\n",res);
}
void add_edge(int u,int v,int w)
{
edge[cnt].cost=w;
edge[cnt].to=v;
edge[cnt].next=pre[u];
pre[u]=cnt++;
}
void init()
{
memset(pre,-1,sizeof(pre));
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
cnt=0;
}
int main()
{
int n,u,v,w,i;
while(scanf("%d",&n)!=EOF&&n)
{
init();
for(i=1;i<=n*(n-1)/2;i++)
{
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);
add_edge(v,u,w);
}
prim();
}
return 0;
}
hdu 1233 堆优化prim
最新推荐文章于 2021-06-21 00:45:39 发布