什么是并查集请点这里
prime算法求最小生成树,本程序的题目条件来源于这篇文章
之前写过prime算法求最小生成树的代码,昨天知道了并查集算法后,就用并查集算法再写一遍求最小生成树的题目。
# include <stdio.h>
# include <stdlib.h>
# include <algorithm>
//读本程序之前 先看一下prime算法求最小生成树那个文章链接,看题目要求
int node[100];
using namespace std;
typedef struct //代表边的结构体
{
int i,j,a; //i为起始节点 j为终止节点 a为边长
}vex;
void CreateGraph(vex v[100],int n)
{
int i,j,k=1;
FILE *fp;
for(i=0;i<n;i++)//边的起始点与结束点赋值,因为是从文件中的矩阵图读入数据,所以可选择的边定为36条
{
for( j =0;j<n;j++)
{
v[i*6 +j].j = j;//终止节点为j
v[i*6 +j].i = i; //起始节点为i
}
}
if((fp = fopen("zrxprim.txt","r"))==NULL)
{
printf("can not open file\n");
}
for(i=0;i<n;i++)//边赋初值
{
for(j=0;j<n;j++)
{
fscanf(fp,"%d",&(v[i*6+j].a));//给每条边的长度赋值
}
}
if(fclose(fp))
{
printf("can not close the file\n");
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%6d ",v[i*6+j].a);//输出图的矩阵
}
printf("\n");
}
printf("有向图的存储结构建立完毕!\n");
}
bool comp(vex a,vex b) //根据边长从小到大排序
{
return a.a<b.a;
}
int find(int i)
{
return i==node[i] ? i :find(node[i]);
}
void main()
{
vex v[100];
CreateGraph(v,6); //固定有6个节点
for(int i = 0;i<6;i++)
{
node[i] = i;
}
int bian = 0;
int sum = 0;
sort(v,v+6*6,comp);
printf("start_vex stop_vex\n");
for(int i = 0;bian < 6-1;i++)
{
if(find(v[i].i) != find(v[i].j))
{
node[find(v[i].j)] = find(v[i].i);
printf("%6d %6d %6d\n",v[i].i,v[i].j,v[i].a);
bian++;
sum+=v[i].a;
}
}
printf("最小生成树长度:%d",sum);
}