纯C语言:贪心Kruskal算法生成树源码

#include <iostream.h>
#define Max 100

typedef struct{
         int u;
		 int v;
		 int weight;
}edge;
edge edges[Max];
int nodes[Max];
void interchange(edge* m,edge* n)
{
	edge temp=*m;
	*m=*n;
	*n=temp;

}
int partition(edge array[],int p,int q)
{
	int i,j;
	i=p;
	j=q+1;
	while(1)
	{
		do i++;
		while((array[i].weight<array[p].weight)&&(i!=q));
		do j--;
        while((array[j].weight>array[p].weight)&&(j!=p));
		if(i<j)
			interchange(&array[i],&array[j]);
		else
			break;
	}
	interchange(&array[p],&array[j]);
	return j;

}
void quicksort(edge array[],int p,int q)
{
	int j;
	if (p<q)
	{
		j=partition(array,p,q);
		quicksort(array,p,j-1);
		quicksort(array,j+1,q);
	}
}
void main()
{
        int i,j,m, n, nodenum, edgenum,safe,cost=0,flag=1 ;
        int presult = 0;

        cout<<"Input the number of nodes and edges:";
        cin>>nodenum>>edgenum;
        cout<<"请输入每条边的起点、终点及权值:"<<endl;
        for(i = 0; i < edgenum; i++)
		{
             cin>>edges[i].u>>edges[i].v>>edges[i].weight;
			 
        }
		for(i=1;i<=nodenum;i++)
			nodes[i]=0;
        quicksort(edges,0,edgenum-1);
        for(i = 0; i < edgenum ; i++)
		{               
                m = edges[i].u;
                n = edges[i].v;
                safe = 0;
                if(nodes[m] == 0 &&nodes[n] == 0){
                        nodes[m] = flag;
						 nodes[n] =flag;
						 flag++;
                        safe = 1;//a safe edge

                }
				else
				{
					if(nodes[m] == 0 ||nodes[n] == 0 )
					{
				    	if(nodes[m] == 0 )                        
					        nodes[m] = nodes[n];
				      	else nodes[n]=nodes[m];
				        
                        safe = 1;//a safe edge
					}
					else 
						if(nodes[m] != nodes[n])
						{					
                              for(j = 1; j <= nodenum; j++)
							  {
                                if((nodes[j] == nodes[m] || nodes[j] == nodes[n])&&(j!=m&&j!=n))
								{
                                        nodes[j] = flag;
                                }
							  }  
							  nodes[m]=flag;
							  nodes[n]=flag;
							  flag++;                          
                              safe = 1;//a safe edge

						}

                }
				 
                if(safe == 1){//reserve a safe edge

                        edges[presult].u = m;
                        edges[presult].v = n;
                        edges[presult].weight = edges[i].weight;
                        presult++;
                }
       
              if(presult == nodenum-1 ){//found mst

                        break;
                } 
		}
        cout<<"Print the result:"<<endl;
		cout<<"起点   终点   权值"<<endl;
                for(i = 0; i < presult; i++)
				{
					cost=cost+edges[i].weight;
                    cout<<edges[i].u<<"       "<< edges[i].v<<"         "<< edges[i].weight<<endl;
				}
				cout<<"最小生成树的权值为:"<<cost<<endl;
               
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值