#include<bits/stdc++.h>
#define R register int//优化,可忽略
#define P pair <int,int>
using namespace std;
int k,n,m;
int cnt,sum,dis[10005],vis[10005];
vector <int> E[200005];//存点
vector <int> W[200005];//存边
inline void add(int u,int v,int w) {
E[u].push_back(v);//存点
W[u].push_back(w);//存边
}
priority_queue <P,vector<P>,greater<P> > q;//递减
inline void prim() {//神似dijskra
memset(dis,127,sizeof(dis));//初始化
dis[1]=0;//初始化
q.push(make_pair(dis[1],1));//初始化
while(!q.empty()&&cnt<n) {
int d=q.top().first,u=q.top().second;
q.pop();
if(vis[u]) continue;//访问过就不访问了
cnt++;
sum+=d;//有就加
vis[u]=1;
for(R i=0; i<E[u].size(); i++)//dijskra这里是循环找中界点,而这里则直接找与该点相邻的边,刷新一遍距离
if(W[u][i]<dis[E[u][i]]){
dis[E[u][i]]=W[u][i];
q.push(make_pair(dis[E[u][i]],E[u][i]));
}
}
}
int main() {
scanf("%d%d",&n,&m);
for(R i=1; i<=m; i++) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
prim();
if (cnt==n)printf("%d",sum);
else printf("NO");
}
Prim堆优化
最新推荐文章于 2024-05-11 10:34:06 发布