Prim
- 从单一顶点开始
- 不断加入最小的边,且边的一个顶点在树中一个顶点不在
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int t,l,nxt;
}E;
E edge[1010110];
int head[101010];
int cnt;
int n,m;
void insert(int a,int b,int v){
edge[++cnt].t=b;
edge[cnt].l=v;
edge[cnt].nxt=head[a];
head[a]=cnt;
}
struct ty{
int x,len;
bool operator < (const ty &a) const {
return len>a.len;
}
};
int dis[101010],vis[101010];
priority_queue<ty>q;
int prim(){
int ans=0;
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
vis[1]=1;
for(int i=head[1];i!=-1;i=edge[i].nxt){
ty tmp;
tmp.x=edge[i].t;
tmp.len=edge[i].l;
// dis[tmp.x]=tmp.len;
q.push(tmp);
}
while(!q.empty()){
ty tmp=q.top();
q.pop();
if(vis[tmp.x]) continue;
vis[tmp.x]=1;
ans+=tmp.len;
for(int i=head[tmp.x];i!=-1;i=edge[i].nxt){
if(vis[edge[i].t])continue;
if(dis[edge[i].t]<=edge[i].l) continue;
ty tmp;
tmp.x=edge[i].t;
tmp.len=edge[i].l;
q.push(tmp);
}
}
return ans;
}
int main(){
memset(head,-1,sizeof(head));
cin >> n >> m;
for(int i=0;i<m;i++){
int a,b,v;
cin >> a >> b >> v;
insert(a,b,v);
insert(b,a,v);
}
cout << prim() << endl;
return 0;
}
Kruskal