并查集求最小生成树

来源:互联网 发布:大富豪棋牌源码3.4.1 编辑:程序博客网 时间:2024/06/04 01:28

什么是并查集请点这里
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);}

这里写图片描述

原创粉丝点击