RT,题目链接http://zju.acmclub.com/index.php?app=problem_title&id=1&problem_id=2336
需要注意的问题有:
1.可以使用Kruskal算法,在判断回路时使用并查集结构;
2.并查集使用树的双亲指针数组作为存储结构,大小为树中点的数目;
初始化时:初始每一个点为一个单独的联通分量,S[i]=-1 for 1<=i<=|V|;
Find(S,x):返回单元素x所在的子集合名字(用树根来代表),这里如果两个点所返回的子集合名字相同,说明这两个点同属于一个连通分量;这种情况也说明,如果把当前边再加入这个连通分量中,就会产生回路;
Union(S,root1,root2):把以x为根的子集合与以y为根的子集合合并到一起;即对应把两个连通分量合并为一个,root1和root2可以通过Find函数找到根;
3.需要额外判断给定的数据是否能使图连通,方法是执行Kruskal算法后,数一数S[]数组中-1的个数,它的个数cnt即代表了算法结束后连通分量的个数,如果为1,说明有一个MST;否则若图不连通,树也必定不连通,故cnt一定大于1
4.边集用结构体数组来存,可以开的大一点,我刚开始就是开小了返回段错误;
5.排序可以用高效的库函数qsort,自己写一个比较函数MyCmp实现结构体数组