生成树(最小生成树及次小生成树)

一.最小生成树

1.定义

在一个含有n个节点的无向图中,找到一棵含有n个节点的树,且该树边权总和最小

2.算法

prim,贪心,O(m)

3.实现过程

1.假设没有边,这n个都为独立的n个点,准备通过边来连接这n个点
2.对所有边排序,从最小的边开始选择是否连接
3.若边上两点已经间接连接,则continue
否则:将其连接,将边权加入sum
4.结果:n个点均直接或间接连接,break
判断是否间接连接???
我们用并查集来写

4.代码实现

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
const int M=1e6+10;
struct ppp {
    
    
	int u,v,c,next;
} e[M];
int vex[N],fa[N],k;
void add(int u,int v,int c) {
    
    
	k++;
	e[k].u=u;
	e[k].v=v;
	e[k].c=c;
	e[k].next=vex[u];
	vex[u]=k;
}
int find(int x) {
    
    
	if(x==fa[x])return x;
	else return fa[x]=find(fa[x]);
}
int cmp(ppp x,ppp y) {
    
    
	return x.c>y.c;
}
int main() {
    
    
	int n,m,u,v,c;
	cin>>n>>m;
	for(int i=1; i<=m; i++) {
    
    
		cin>>u>>v>>c;
		add(u,v,c);
	}
	for(int i=1; i<=n; i++)fa[i]=i;
	sort(e+1,e+k+1,cmp);
	int cnt=1,dissum=0;
	for(int i=1; i<=k; i++) {
    
    
		int p1=find(e[i].u);
		int p2=find(e[i].v);
		if(p1!=p2){
    
    
			fa[p1]=p2;
			cnt++;
			dissum+=e[i].c;
			if(cnt>=n)break;
		}
	}
	return 0;
}


5.开始刷题

例题1(自己编的,无超链接)
题目描述:无向连通图中有n个点,求最近距离最远的dis(s,t)
题解:无向连通图中建一个最小生成树,求最小生成树的直径即可

二.次小生成树

猜你喜欢

转载自blog.csdn.net/weixin_43602607/article/details/110293737