首页 > 编程 > C++ > 正文

Kruskal算法的C++语言程序

2019-11-11 05:17:51
字体:
来源:转载
供稿:网友

Kruskal算法是有关图的最小生成树的算法。Kruskal算法是两个经典的最小生成树算法之一,另外一个是PRim算法。

程序来源:Minimum Spanning Tree using Krushkal’s Algorithm。

百度百科:Kruskal算法。

维基百科:Kruskal's Algorithm。

C++语言程序:

/* Krushkal's Algorithm to find minimum spanning tree by TheCodersPortal */#include <iostream>#include <map>using namespace std;/* Structure of a Disjoint-Set node */typedef struct dset{    char data;    int rank;    struct dset* parent;}dset;/* To count the number of disjiont sets present at a time */int count=0;/* Map is used to get the address of the node by its data */map <char,dset*> mymap;/* MakeSet function is responsible for creating a disjoint-set whose only member is data,    initially the rank is 0 and it is the representative of itself */void MakeSet(char data){    dset* node=new dset;    node->data=data;    mymap[data]=node;    node->rank=0;    node->parent=node;    count++;}/* FindSetUtil takes input to the pointer to the node and return the pointer to    the representative of that node. A Heuristic is used here, path compression    which means that all the nodes on the find path point directly to the root */dset* FindSetUtil(dset* node){    if(node!=node->parent)        node->parent=FindSetUtil(node->parent);    return node->parent;}/*FindSet function is used to find the node using the data and pass this node to FindSetUtil*/char FindSet(char x){    dset* node=mymap[x];    node=FindSetUtil(node);    return node->data;}/*isconnected checks whether the two elements of the set are connected or not */bool isconnected(char x,char y){    return (FindSet(x)==FindSet(y));}/* LinkSet is responsible for union of two disjoint set according to a Heuristics, Union by Rank */void LinkSet(char x,char y){    if(isconnected(x,y))        return;    dset* node1=mymap[x];    dset* node2=mymap[y];    if(node1->rank>node2->rank)        node2->parent=node1;    else        node1->parent=node2;    if(node1->rank==node2->rank)    {        node1->rank=node1->rank+1;    }    count--;}/* UnionSet calls the LinkSet function with arguments as FindSet(x),FindSet(y) */void UnionSet(char x,char y){    LinkSet(FindSet(x),FindSet(y));}/* freeset is used to free the memory allocated during the run-time */void freeset(char arr[],int n){    for(int i=0;i<n;i++)    {        dset* node=mymap[arr[i]];        delete node;    }}void QuickSort(int array[],int low,int high,char edgein[],char edgeout[]){    int i=low,j=high;    /* Here we are taking pivot as mid element */    int pivot=array[(low+high)/2];    /* Partitioning the array */    while(i<=j)    {        while(array[i]<pivot)            i++;        while(array[j]>pivot)            j--;        if (i<=j)        {            /* Swapping of elements at ith index and jth index */            int temp = array[i];            array[i] = array[j];            array[j] = temp;            char tmp=edgein[i];            edgein[i]=edgein[j];            edgein[j]=tmp;            tmp=edgeout[i];            edgeout[i]=edgeout[j];            edgeout[j]=tmp;            i++;            j--;        }    }    /* Recursion */    if (i<high)        QuickSort(array, i, high,edgein,edgeout);    if (j>low)        QuickSort(array, low, j,edgein, edgeout);}/* MSTKrushkal is the function which is used to find minimum spanning treeusing Krushkal's    Algorithm */void MSTKrushkal(char vertices[],char edgein[],char edgeout[],int weight[],int n,int m){    //int n=sizeof(vertices)/sizeof(vertices[0]);    for(int i=0;i<n;i++)    {        MakeSet(vertices[i]);    }    /*Sorting of edges in non-decreasing order of their weights */    QuickSort(weight,0,m-1,edgein,edgeout);    int A=0;    cout<<"Minimum spanning tree containing edges"<<endl;    for(int i=0;i<9;i++)    {        /* if adding the edge result in cycle, ignore the edge */        if(isconnected(edgein[i],edgeout[i]))            continue;        /* Add the edge to the minimum spanning tree */        UnionSet(edgein[i],edgeout[i]);        A+=weight[i];        cout<<edgein[i]<<"--"<<edgeout[i]<<endl;    }    cout<<"Total weight = "<<A<<endl;    freeset(vertices,n);}/* Driver program to test the above functions */int main(){    /* vertices array contains all the vertices of the graph */    char vertices[]={'A','B','C','D','E','F'};    /* edgein,edgeout and weight array indicates that there is an edge    between vertices edgein[i] and edgeout[i] having weight weight[i] */    char edgein[]={'A','A','A','B','B','C','C','D','D'};    char edgeout[]={'B','D','C','D','E','D','F','E','F'};    int weight[]={6,5,3,8,2,2,6,5,3};    int n=sizeof(vertices)/sizeof(vertices[0]);    int m=sizeof(weight)/sizeof(weight[0]);    MSTKrushkal(vertices,edgein,edgeout,weight,n,m);}程序运行结果:

Minimum spanning tree containing edgesB--EC--DD--FA--CD--ETotal weight = 15


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选