回 帖 发 新 帖 刷新版面

主题:我的最优二叉树算法会出现回路啊?

源代码如下:
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include <conio.h>
#define max_size 100
typedef int status;
typedef struct krus  {
    int node1;//边的起始顶点
    int node2;//边的终止顶点
    int vex;//
}krus ;   
typedef struct PTNode  {//树的结点结构
    int data;
    int parent;//双亲位置
}PTNode;
typedef struct PTree  {//树的结构
    PTNode nodes[max_size];
    int n;    //结点数
}PTree;
typedef PTree MFSet;
int initptree(MFSet* p)  {//初始化操作,构建PTree
    int i;
    (*p).n=8;
    for(i=0;i<8;++i)  {
        (*p).nodes[i].data=i;
        (*p).nodes[i].parent=-1;
    }return 0;
}    
int find_mfset(MFSet S,int i)  {//找集合S中i所在子集的根
    int j;
    if(i<1||i>S.n||j>S.n) return -1;
    for(j=i;S.nodes[j].parent>0;j=S.nodes[j].parent);
    return j;
}
int merge_mfset(MFSet &S,int i,int j)
{//S.node[i]和S.node[j]分别为S的互不相交的两个子集Si和Sj的根结点
//求并集SiUSj
if(i<1||i>S.n||j>S.n) return -1;
else S.nodes[i].parent=j;
return 1;
}

回复列表 (共1个回复)

沙发

int mix_mfset(MFSet *S,int i,int j)  {    
    
    if(i<1||i>(*S).n||j>(*S).n)
  return -1;
if((*S).nodes[i].parent>(*S).nodes[j].parent)
{
  (*S).nodes[j].parent+=(*S).nodes[i].parent;
  (*S).nodes[i].parent=j;
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
else
{
  (*S).nodes[i].parent+=(*S).nodes[j].parent;
  (*S).nodes[j].parent=i;
}
    return 1;
}
int fix_mfset(MFSet* s,int i)  {
    int j,k,t;
    if(i<1||i>(*s).n)  return -1;
    for(j=i;(*s).nodes[j].parent>0;j=(*s).nodes[j].parent);
    for(k=i;k!=j;k=t)  {
        t=(*s).nodes[k].parent;  (*s).nodes[k].parent=j;
    }
    return j;
}
status kruskal()  {
    int n;
int grah[8][8]={
    {-1, 4, 3, -1,-1,-1,-1,-1},
    { 4,-1, 5,5, 9,-1,-1,-1},
    { 3, 5,-1, 5, -1, -1,-1,5},
    { -1,5, 5,-1,7, 6,5,4},
    {-1, 9, -1,7,-1, 3,-1,-1},
    {-1,-1, -1, 6, 3,-1,2,-1},
    {-1,-1,-1,5,-1,2,-1,6},
    {-1,-1,5,4,-1,-1,6,-1}};

    krus ve[10],vetemp;  MFSet tree;
    int i,j,k=0,temp=1,nodex,nodey,nodevex,gen1,gen2,js=0;
    for(i=0;i<8;++i)  {
        for(j=temp;j<8;++j)  {
            if(grah[i][j]!=-1)  {
               ve[k].node1=i;  ve[k].node2=j;
               ve[k].vex=grah[i][j];  ++k;
            }
         }
         ++temp;
    }
    initptree(&tree);
    
    for(i=9;i>0;--i)  {
        for(j=0;j<i;j++)  {
            if(ve[j].vex>ve[j+1].vex)  {
                vetemp=ve[j];  ve[j]=ve[j+1];  ve[j+1]=vetemp;
            }
        }
    }
   
    for(i=0;i<10&&js<7;++i)  {
         nodex=ve[i].node1;  nodey=ve[i].node2;  nodevex=ve[i].vex;
         gen1=find_mfset(tree,nodex);  gen2=find_mfset(tree,nodey);
         if(gen1!=gen2)  {
             ++js;
             mix_mfset(&tree,gen1,gen2);
             printf("%d gen:%d, %d gen:%d\n",nodex,gen1,nodey,gen2);
             printf("the %d:%d->%d is %d\n",i,nodex,nodey,nodevex);
         }
    }
               
   return 0;     
        
        
}      
void main()  {
    
    kruskal();
   
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册