一、基本思想
二、代码实现
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
const int sizeM = 200005;
const int sizeN = 5005;
using namespace std;
int k,n,m,cnt,sum,ai,bi,ci,head[sizeN],dis[sizeN],vis[sizeN];
int read(){
int f = 1, ans = 0;
char c;
c = getchar();
while(c <'0' || c > '9'){
if(c == '-'){
f = -1;
}
c = getchar();
}
while(c >= '0' && c <='9'){
ans = ans*10+c - '0';
c = getchar();
}
return ans * f;
}
struct Edge{
int v,w,next;
}e[sizeM<<1];
struct Node{
int vertex;
int weight;
Node(){};
Node (int vertex, int weight){
this->vertex = vertex;
this->weight = weight;
}
bool operator < (const Node & a) const{
return weight > a.weight;
}
}node;
void add(int u,int v,int w){
e[++k].v=v;
e[k].w=w;
e[k].next=head[u];
head[u]=k;
}
void prim(){
dis[1]=0;
priority_queue <Node > q;
q.push(Node(1,0));
while(!q.empty()&&cnt<n){
node = q.top();
q.pop();
int d= node.weight, u = node.vertex;
if(vis[u]){
continue;
}
cnt++;
sum+=d;
vis[u]=1;
for(int i=head[u];i!=-1;i=e[i].next){
if(e[i].w<dis[e[i].v]){
dis[e[i].v]=e[i].w;
q.push(Node(e[i].v,dis[e[i].v]));
}
}
}
}
int main(){
memset(dis,0x3f,sizeof(dis));
memset(head,-1,sizeof(head));
n = read(); m = read();
for(int i=1;i<=m;i++){
ai = read(); bi = read(); ci = read();
add(ai,bi,ci);
add(bi,ai,ci);
}
prim();
if (cnt==n)
printf("%d\n",sum);
else
printf("orz\n");
}