prim:以点为衡量
cpp
#include<bits/stdc++.h>
using namespace std;
//prim
int main(){
int v,e;
cin>>v>>e;
vector<vector<int>>graph(v+1,vector<int>(v+1,10001));
while(e--){
int v1,v2,val;
cin>>v1>>v2>>val;
graph[v1][v2]=val;
graph[v2][v1]=val;
}
vector<int>minDist(v+1,10001);
vector<bool>inTree(v+1,false);
for(int i=0;i<v;i++){//只需要n-1次
int cur=-1;
int minval=INT_MAX; //在里面,每次都从max开始
for(int j=1;j<=v;j++){
if(!inTree[j]&&minval>minDist[j]){
cur=j;
minval=minDist[j];
}//选出最小的一个
}
inTree[cur]=1;
for(int k=1;k<=v;k++){
if(!inTree[k]&&minDist[k]>graph[k][cur]){
minDist[k]=graph[k][cur];
}
}
}
int res=0;
for(int i=2;i<=v;i++){
res+=minDist[i];
}
cout<<res<<endl;
}
kruskal:维护边的集合
cpp
#include<bits/stdc++.h>
using namespace std;
struct Edges{
int l,r,val;
};
vector<int>father(10001,0);
void init(){
for(int i=1;i<10001;i++)father[i]=i;
}
int find(int u){
if(u==father[u])return u;
else return father[u]=find(father[u]);
}
void join(int u,int v){
u=find(u);
v=find(v);
if(u==v)return;
father[v]=u;
}
bool issame(int u,int v){
u=find(u);
v=find(v);
if(u==v)return true;
else return false;
}
bool cmp(Edges& a,Edges& b){
return a.val<b.val;
}
int main(){
init();//怎么又忘了!!!!!!!!输出都是0!!!!!
int v,e;
cin>>v>>e;
vector<Edges>edges;
while(e--){
int l,r,val;
cin>>l>>r>>val;
edges.push_back({l,r,val});
}
sort(edges.begin(),edges.end(),cmp);
int res=0;
for(Edges edg:edges){
int v1=edg.l;
int v2=edg.r;
if(!issame(v1,v2)){
res+=edg.val;
join(v1,v2);
}
}
cout<<res<<endl;
}