minimum spanning tree Kruskal方法完整代码及实现

本文介绍了一种寻找加权图的最小生成树的算法——Kruskal算法,并提供了一个具体的实现示例。该算法通过逐步选择权重最小且不会形成环路的边来构造最小生成树。

在这里插入图片描述
在这里插入图片描述
Kruskal 的原理:简单语言叙述:用边判断。
依次找到最小边,判断最小生成树中是否形成环,不形成就要这个边,成环就不要。直到所有的点都在树里了就停止。

#include <stdio.h>
#include <stdlib.h>

//int checkcycle(int graph1[11][11], int V, int W);
int connected(int a[11][11],int from,int to);
void Kruskal (int graph[11][11]);
//int DFS(int graph1[11][11],int known[11],int n,int shang);
//void DFS(int V, int graph1[11][11],int graph2[11][11],int *array, int *known);
int main()
{
    int graph[11][11];
    int i,j,I;
    char a,b;
    int c;
    scanf("%c,%c,%d",&a,&b,&c);
    for(i=0;i<11;i++)
    {
        for(j=0;j<11;j++)
        {
            graph[i][j]=0;
        }
    }
    int x=a-64;
    int y=b-64;
    graph[1][2]=3;
    graph[1][4]=4;
    graph[1][5]=4;
    graph[2][1]=3;
    graph[2][5]=2;
    graph[2][3]=10;
    graph[2][6]=3;
    graph[3][2]=10;
    graph[3][6]=6;
    graph[3][7]=1;
    graph[4][1]=4;
    graph[4][5]=5;
    graph[4][8]=6;
    graph[5][1]=4;
    graph[5][2]=2;
    graph[5][4]=5;
    graph[5][6]=11;
    graph[5][8]=2;
    graph[5][9]=1;
    graph[6][2]=3;
    graph[6][3]=6;
    graph[6][7]=2;
    graph[6][5]=11;
    graph[6][9]=3;
    graph[6][10]=11;
    graph[7][3]=1;
    graph[7][6]=2;
    graph[7][10]=8;
    graph[8][4]=6;
    graph[8][5]=2;
    graph[8][9]=4;
    graph[9][8]=4;
    graph[9][5]=1;
    graph[9][6]=3;
    graph[9][10]=7;
    graph[10][6]=11;
    graph[10][7]=8;
    graph[10][9]=7;
    graph[x][y]=c;
    graph[y][x]=c;
    Kruskal (graph);

    return 0;
}
void Kruskal (int graph[11][11])
{
    int graph1[11][11];
    //int E=10;int e=0;
    int i,j,I,J;
    int min=11;
    int edge=19,edge1=0;
    for(i=0;i<11;i++)
    {
        for(j=0;j<11;j++)
        {
            graph1[i][j]=0;
        }
    }
    //while(e<9&&E>=0)
    while(edge1<9&&edge>0)
    {
        min=11;
        for(i=1;i<11;i++)
        {
            for(j=1;j<11;j++)
            {
                if(graph[i][j]<min&&graph[i][j]!=0)
                {
                    min=graph[i][j];
                    I=i;
                    J=j;
                }
            }
        }
        graph[I][J]=0;
        graph[J][I]=0;
        int judge=connected(graph1,I,J);
        if(judge==0)//无圈//
        {           
            printf("%d,",min);
            //E--;e++;
            edge1++;
            graph1[I][J]=min;
            graph1[J][I]=min;
        }
        else{}//无圈//
        edge--;       
    }
}
int connected(int a[11][11],int from,int to)
{
	int i,j,k;
	int vertex[15];
	int front,rear;
	if(from==to)
	{
	    return 1;//有圈//
	}
	front=rear=0;
	vertex[rear++]=from;
	while(front<rear)
	{
		i=vertex[front];
        for(j=1;j<11;j++)
        {
            if(a[i][j]!=0)
			{
				if(j==to)
				{
				    return 1;
				}
				for(k=0;k<rear;k++)
				{
				    if(vertex[k] == j)
				    {
				        break;
				    }						
				}
				if(k==rear)
				{
				    vertex[rear++]=j;
				}
			}
        }
		front++;
	}
	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值