一.最小生成树
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)
题解:无向连通图中建一个最小生成树,求最小生成树的直径即可