並查集求最小生成樹

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

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章