最小生成树代码 for u,v
时间: 2023-07-22 13:42:42 浏览: 109
最小生成树代码
以下是使用Kruskal算法实现的最小生成树代码,其中u和v是指图的两个节点。
```
#include<iostream>
#include<algorithm>
using namespace std;
int p[10001],n,m,sum;
struct node{
int x,y,w;
}a[100001];
bool cmp(node p,node q){
return p.w<q.w;
}
int find(int x){
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy) p[fx]=fy;
}
int main(){
cin>>n>>m; // n 为图的节点数,m 为边数
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1;i<=m;i++) cin>>a[i].x>>a[i].y>>a[i].w;
sort(a+1,a+m+1,cmp); //将边按权值从小到大排序
for(int i=1;i<=m;i++){
if(find(a[i].x)!=find(a[i].y)){
merge(a[i].x,a[i].y);
sum+=a[i].w;
}
}
cout<<sum<<endl;
return 0;
}
```
在上面的代码中,我们首先定义了一个结构体node,用于表示图中的边,包含了两个节点和边的权值。然后我们使用Kruskal算法来实现最小生成树的计算。具体过程是将所有边按照权值从小到大排序,然后依次选择边,如果两个节点不在同一个集合中,则将它们合并,同时将边的权值加入到最小生成树的权值中。最后输出最小生成树的权值即可。
阅读全文