宝玛科技网
您的当前位置:首页离散数学大作业

离散数学大作业

来源:宝玛科技网
离散数学大作业

最小生成树的编程实现:Kruskal算法 一、 程序代码:

# include #define N 255 typedef struct {

int begin,end; int weight; }graphedge;

int getedge(graphedge edge[]); void swap(int * p1,int * p2);

void sortedge(graphedge edge[],int k); int find(int father[],int e);

void kruskal(graphedge edge[],int k); int main(void) {

int n; /*n为图的实际边树*/ graphedge edgea[N]; /*存储图的数组*/

n=getedge(edgea); /*将图的顶点、边和权输入数组*/

sortedge(edgea,n); /*将图的边集数组按边权值排序*/

kruskal(edgea,n); /*求带权的最小生成树*/ return 0; }

int getedge(graphedge edge[]) /*建立图的数组,并返回图的边数*/

{

int k,a,b; int c;

printf(\"请输入图的总边树:\\n\"); scanf(\"%d\ for(int i=1;i<=k;i++) { printf(\"起点 终点 权 =\"); scanf(\"%d %d %d\ edge[i].begin=a; edge[i].end=b; edge[i].weight=c;

} return (k); }

void swap(int* p1,int* p2) /*交换函数*/ {

int temp; temp=*p1; *p1=*p2; *p2=temp; }

void sortedge(graphedge edge[],int k) /*将所有的边按权值排序*/

{

for(int i=1;ifor(int j=i+1;j<=k;j++) {

if(edge[i].weight>edge[j].weight)

swap(&edge[i].begin,&edge[j].begin); }

int find(int father[],int e) /*查找与起点连接的终点数组*/

{

}

swap(&edge[i].end,&edge[j].end); swap(&edge[i].weight,&edge[j].weight);

int f=e;

while(father[f]>0)

f=father[f];

return (f); }

void kruskal(graphedge edge[],int k) /*构造最小生成树的Kruskal算法*/

{

int father[N],begin1,end1,i; printf(\"最小生成树为:\\n\"); for(i=1;i<=k;i++)

father[i]=0;

for(i=1;i<=k;i++) {

printf(\"%d\%d\%d\\n\

}

begin1=find(father,edge[i].begin); end1=find(father,edge[i].end); if(begin1!=end1) {

father[begin1]=end1;

} }

二、 运行结果:

因篇幅问题不能全部显示,请点此查看更多更全内容