并查集实现kruskal算法
kruskal算法:求最小生成树,给定n个节点,m条边和边的权值,创建一个总权值最小的树 这里用到了并查集的思想:如果要加入的边两个顶点在同一个集合里(代码里即为find(int x)相同),就说明会形成环,这是不行的,否则抓出最小的那条边,放入集合之中,并且标记这条边,下次遍历的时候跳过 到集合总边数为n-1时,不必再寻找,跳出循环。 # include <iostream> # include <algorithm> # define maxn 100 using namespace std ; int fa [ maxn ] ; int edge [ maxn ] [ maxn ] ; int vis [ maxn ] ; typedef struct node { int to ; int end ; int x ; //权值 } node ; node nod [ maxn ] ; void init ( int n ) { for ( int i = 1 ; i <= n ; i ++ ) { fa [ i ] = i ; } } int find ( int x ) { if ( x == fa [ x ] ) return x ; else return fa [ x ] = find ( fa [ x ] ) ; } void uni ( int x , int