什麼是並查集請點這裏
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);
}