相比较克鲁斯卡尔来说,prime 和 迪杰斯特拉是以点展开验证边。而克鲁斯卡尔是以边为展开看连接点点是否属于都一个跟(并查集)
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAXN 11 //顶点个数的最大值
#define MAXM 20 //边的个数的最大值
using namespace std;
//测试样例
//7 12
//1 2 12
//1 6 16
//1 7 14
//2 6 7
//2 3 10
//3 6 6
//3 4 3
//3 5 5
//4 5 4
//5 6 2
//5 7 8
//6 7 9
struct edge //边
{
int u, v, w; //边的顶点、权值
}edges[MAXM]; //边的数组
int parent[MAXN]; //parent[i]为顶点 i 所在集合对应的树中的根结点
int n, m; //顶点个数、边的个数
int i, j; //循环变量
void UFset( ) //初始化
{
for( i=1; i<=n; i++ )
parent[i] = -1;
}
int Find( int x ) //查找并返回节点 x 所属集合的根结点
{
int s; //查找位置
for( s=x; parent[s]>=0; s=parent[s] );
while( s!=x ) //优化方案―压缩路径,使后续的查找操作加速。
{
int tmp = parent[x];
parent[x] = s;
x = tmp;
}
return s;
}
//将两个不同集合的元素进行合并,使两个集合中任两个元素都连通
void Union( int R1, int R2 )
{
int r1 = Find(R1), r2 = Find(R