guo01234 2015-05-22 13:29 采纳率: 0%
浏览 2329

使用MFSet集合及克鲁斯卡尔算法实现最小生成树,但是最后结果总不对,求大神指教!

#include "stdafx.h"
#include "stdafx.h"
#include
#include

#define MAX_SIZE 100 //树的最大结点数
#define MAX_VEX_NUM 20 //最大顶点数
#define MAX_EDGE_NUM 190 //最大边数
//边集
typedef struct
{
char begin;

char end;

int weight;
}Edge;
//图结构
typedef struct{
Edge edge[MAX_EDGE_NUM];
char vex[MAX_VEX_NUM];
int vexnum,edgenum;
}Graph;
//树的节点结构
typedef struct Node{
char data;
int parent;
}Node;
//树的双亲表示存储结构
typedef struct{
Node node[MAX_SIZE];
int n; //结点数
}PTree,MFSet;
//初始化MFSet集合
void initMFSet(MFSet *S,Graph G){
if(!S) exit(0);
for(int i=0;i S->node[i].data=G.vex[i];
S->node[i].parent=-1;
}
S->n=G.vexnum;
}

int find_mfset(MFSet S,int i){
if(iS.n) exit(0);
int j;
for(j=i;S.node[j].parent>0;j=S.node[j].parent);
return j;
}
//合并
void merge(MFSet *S,int i,int j){
if(iS->n||jS->n) exit(0);
S->node[j].parent=i;
}
//创建无向网
void creatGraph(Graph *G){
printf("请输入定点元素个数以及边数:");
scanf("%d,%d",&G->vexnum,&G->edgenum);
if(G->edgenum>MAX_EDGE_NUM||G->vexnum>MAX_VEX_NUM){
printf("输入错误,请重新输入:");
scanf("%d,%d",&G->vexnum,&G->edgenum);
}
printf("请输入各个定点信息:\n");
for(int i=0;ivexnum;i++){
fflush(stdin);
scanf("%c",&G->vex[i]);
}
printf("请输入每条边的两个定点和权值:\n");
for(int i=0;iedgenum/2;i++){
fflush(stdin);
scanf("%c,%c,%d",&G->edge[i].begin,&G->edge[i].end,&G->edge[i].weight);
// G->edge[i].weight = rand()%100;

}
for(int i=G->edgenum/2;i<G->edgenum;i++){
    G->edge[i].begin=G->edge[i-G->edgenum/2].end;
    G->edge[i].end=G->edge[i-G->edgenum/2].begin;
    G->edge[i].weight=G->edge[i-G->edgenum/2].weight;
}

}
//找到网中某一结点元素在顶点数组中的位置
int vexLocate(Graph G,char c){
for(int i=0;i<G.vexnum;i++){
if(c==G.vex[i])
return i;
}
return -1;
}

void minSpanTree(Graph *G){
int parent[MAX_VEX_NUM];
int m,n,temp;
char a,b;
for(int i=0;ivexnum;i++){
parent[i]=0;
}
MFSet S;
initMFSet(&S,*G);

//使用冒泡排序法将边集的权值按从小到大排序
for(int i=0;i<G->edgenum;i++){
    for(int j=0;j<G->edgenum-i-1;j++){
        if(G->edge[j].weight>G->edge[j+1].weight){
            a=G->edge[j].begin;
            b=G->edge[j].end;
            temp=G->edge[j].weight;
            G->edge[j].begin=G->edge[j+1].begin;
            G->edge[j].end=G->edge[j+1].end;
            G->edge[j].weight=G->edge[j+1].weight;
            G->edge[j+1].begin=a;
            G->edge[j+1].end=b;
            G->edge[j+1].weight=temp;
        }
    }
}

for(int i=0;i<G->edgenum;i++){

    m=find_mfset(S,vexLocate(*G,G->edge[i].begin));
    n=find_mfset(S,vexLocate(*G,G->edge[i].end));
    if(m!=n){  //说明没有形成回路
        merge(&S,m,n);
        printf("<%c,%c>,%d\t",G->edge[i].begin,G->edge[i].end,G->edge[i].weight);
    }
}

}

int _tmain(int argc, _TCHAR* argv[])
{
Graph G;
creatGraph(&G);
minSpanTree(&G);
system("pause");
return 0;

}

  • 写回答

2条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog