如果某条边是跨越集合且边权最小的边,那么所有最小生成树一定经过它,
而回路上边权最大的边,所有最小生成树一定不经过它。
最小生成树有Prim算法,适用于稠密图,时间复杂度O(n^2)(优化后O(nlogn),不如Kruskal方便)。
下面是Kruskal算法模板:
bool operator <(rec a,rec b){ return a.z<b.z; } IN int get(int x){ if(x==fa[x]) return x; return fa[x]=get(fa[x]); } int main(){ int n,m,ans=0,cnt=0; scanf("%d %d",&n,&m); REP(i,1,m) scanf("%d %d %d",&edge[i].x,&edge[i].y,&edge[i].z); sort(edge+1,edge+1+m); REP(i,1,n) fa[i]=i; REP(i,1,m){ int x=get(edge[i].x),y=get(edge[i].y); if(x==y) continue; fa[x]=y; ans+=edge[i].z; cnt++; if(cnt==n-1) break; } if(cnt!=n-1) printf("orz"); else printf("%d",ans);
次小生成树:(待完善)
最小树形图:(朱刘算法)
1.找到除了root以为其他点的权值最小的入边。用In[i]记录
2.如果出现除了root以为存在其他孤立的点,则不存在最小树形图。
3.找到图中所有的环,并对环进行缩点,重新编号。
4.更新其他点到环上的点的距离
5.重复3,4直到没有环为止
(待完善)