构造最小生成树一般使用贪心策略,每次优先选择边权值最小的边
最小生成树的边数==点数-1
例子: HDOJ 1863 畅通工程
kruskal算法(用到并查集的知识):按边权值的大小从小到大排序,从边集中选取一条权值最小的边,若该边的两个顶点分属不同的树 ,则将其加入子图,也就是这两个顶点分别所在的 两棵树合成一棵树(通过并查集);反之,若该边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林只有一棵树
while (scanf("%d %d", &n, &m) != EOF, n)
{
num = 0;
sum = 0;
memset(father, 0, sizeof(father));