

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

被折叠的 条评论
为什么被折叠?



