最小生成树的数据结构实现

时间:2022-07-24 11:38:35

这里的最小生成树是指无向图的

每条边有大于0的整数的权值

这里有2种算法

一个为PRIM 这个算法时间要  O(n2)

另一个算法为Kruskal算法时间为O(elog2e)

但是这里还有个潜在的排序要实现,我这里排序并没有用好的算法

主要是为了实现Kruskal的思想

其排序的一些算法将在后续推出

最小生成树的数据结构实现#include <stdio.h>
最小生成树的数据结构实现
#define MAX 100
最小生成树的数据结构实现
#define INF 32767
最小生成树的数据结构实现
最小生成树的数据结构实现
void prim(int cost[][MAX],int ver,int  v)
最小生成树的数据结构实现最小生成树的数据结构实现
{
最小生成树的数据结构实现    
int
 i,j,k;
最小生成树的数据结构实现    
int
 min;
最小生成树的数据结构实现    
int lowcost[MAX][2
];
最小生成树的数据结构实现    
for(i=0;i<ver;i++
)
最小生成树的数据结构实现最小生成树的数据结构实现    
{
最小生成树的数据结构实现        lowcost[i][
1]=v;   //这里是指这条边是由谁为起点的

最小生成树的数据结构实现
        lowcost[i][0]=cost[v][i];        //这是这条边的权值
最小生成树的数据结构实现
        if(i==v)
最小生成树的数据结构实现            lowcost[i][
1]=-1
;
最小生成树的数据结构实现    }

最小生成树的数据结构实现    
for(i=0;i<ver-1;i++)
最小生成树的数据结构实现最小生成树的数据结构实现    
{
最小生成树的数据结构实现        min
=
INF;
最小生成树的数据结构实现
最小生成树的数据结构实现        
for(j=0;j<ver;j++
)
最小生成树的数据结构实现最小生成树的数据结构实现        
{
最小生成树的数据结构实现        
最小生成树的数据结构实现            
if(lowcost[j][1]!=-1&&lowcost[j][0]<min&&lowcost[j][0]!=0)  //寻找最小权值可用的边

最小生成树的数据结构实现最小生成树的数据结构实现
            {
最小生成树的数据结构实现                min
=lowcost[j][0
];
最小生成树的数据结构实现                k
=
j;
最小生成树的数据结构实现            }

最小生成树的数据结构实现        }

最小生成树的数据结构实现        printf(
"%d---->%d cost %d ",lowcost[k][1],k,min);
最小生成树的数据结构实现        lowcost[k][
1]=-1
;
最小生成树的数据结构实现        
for(j=0;j<ver;j++)   //修改 lowcost 把新加进来的点的更短的边替换原来的边

最小生成树的数据结构实现最小生成树的数据结构实现
        {
最小生成树的数据结构实现            
if(lowcost[j][1]!=-1&&(lowcost[j][0]>cost[k][j]&&cost[k][j]!=0||lowcost[j][0]==0
))
最小生成树的数据结构实现最小生成树的数据结构实现            
{
最小生成树的数据结构实现                lowcost[j][
0]=
cost[k][j];
最小生成树的数据结构实现                lowcost[j][
1]=
k;
最小生成树的数据结构实现            }

最小生成树的数据结构实现        }

最小生成树的数据结构实现    }

最小生成树的数据结构实现}

最小生成树的数据结构实现
最小生成树的数据结构实现
void Kruskal(int cost[][MAX],int ver,int  v)
最小生成树的数据结构实现最小生成树的数据结构实现
{
最小生成树的数据结构实现    
int edge[MAX][3
];
最小生成树的数据结构实现    
int
 vset[MAX];
最小生成树的数据结构实现    
int
 i,j,k;
最小生成树的数据结构实现    
int
 a,b,c,t;
最小生成树的数据结构实现    
int
 min;
最小生成树的数据结构实现    
//这里用最简单的快排来 实际可以用更快的排序

最小生成树的数据结构实现
    k=-1;
最小生成树的数据结构实现    
for(i=0;i<ver;i++
)
最小生成树的数据结构实现最小生成树的数据结构实现    
{
最小生成树的数据结构实现        vset[i]
=
i;
最小生成树的数据结构实现        
for(j=i;j<ver;j++
)
最小生成树的数据结构实现最小生成树的数据结构实现        
{
最小生成树的数据结构实现            
if(cost[i][j]!=0
)
最小生成树的数据结构实现最小生成树的数据结构实现            
{
最小生成树的数据结构实现                k
++
;
最小生成树的数据结构实现                edge[k][
0]=
i;
最小生成树的数据结构实现                edge[k][
1]=
j;
最小生成树的数据结构实现                edge[k][
2]=
cost[i][j];
最小生成树的数据结构实现            }

最小生成树的数据结构实现        }

最小生成树的数据结构实现    }

最小生成树的数据结构实现    
最小生成树的数据结构实现    
for(i=0;i<k;i++)
最小生成树的数据结构实现最小生成树的数据结构实现    
{
最小生成树的数据结构实现        min
=edge[i][2
];
最小生成树的数据结构实现        t
=
i;
最小生成树的数据结构实现        
for(j=i+1;j<k;j++
)
最小生成树的数据结构实现最小生成树的数据结构实现        
{
最小生成树的数据结构实现            
if(edge[j][2]<
min)
最小生成树的数据结构实现最小生成树的数据结构实现            
{
最小生成树的数据结构实现                t
=
j;
最小生成树的数据结构实现                min
=edge[j][2
];
最小生成树的数据结构实现            }

最小生成树的数据结构实现        }

最小生成树的数据结构实现        
if(t!=i)
最小生成树的数据结构实现最小生成树的数据结构实现        
{
最小生成树的数据结构实现            a
=edge[i][0];b=edge[i][1];c=edge[i][2
];
最小生成树的数据结构实现            edge[i][
0]=edge[t][0];edge[i][1]=edge[t][1];edge[i][2]=edge[t][2
];
最小生成树的数据结构实现            edge[t][
0]=a;edge[t][1]=b;edge[t][2]=
c;
最小生成树的数据结构实现        }

最小生成树的数据结构实现    }

最小生成树的数据结构实现   
// 到这里都是为了排序 其实可以用更好的方法来写 这里比较懒就将就下
最小生成树的数据结构实现

最小生成树的数据结构实现    k
=1;
最小生成树的数据结构实现    i
=0
;
最小生成树的数据结构实现    
while(i<
ver)
最小生成树的数据结构实现最小生成树的数据结构实现    
{
最小生成树的数据结构实现        
if(vset[edge[i][0]]!=vset[edge[i][1]])   //vset为集合 这里不同的边选出来后会有不同的集合

最小生成树的数据结构实现最小生成树的数据结构实现
        {
最小生成树的数据结构实现            printf(
"%d-->%d cost is %d ",edge[i][0],edge[i][1],edge[i][2
]);
最小生成树的数据结构实现            
for(j=0;j<ver;j++
)
最小生成树的数据结构实现                
if(vset[j]==vset[edge[i][1
]])
最小生成树的数据结构实现                    vset[j]
=vset[edge[i][0
]];        
最小生成树的数据结构实现            k
++
;
最小生成树的数据结构实现        }

最小生成树的数据结构实现        i
++;
最小生成树的数据结构实现    }

最小生成树的数据结构实现}

最小生成树的数据结构实现
最小生成树的数据结构实现
int  main()
最小生成树的数据结构实现最小生成树的数据结构实现
{
最小生成树的数据结构实现    
int
 cost[MAX][MAX];
最小生成树的数据结构实现    
int
 i,j;
最小生成树的数据结构实现    
int
 a,b,c;
最小生成树的数据结构实现    
int
 ver,arc;
最小生成树的数据结构实现    
for(i=0;i<MAX;i++
)
最小生成树的数据结构实现        
for(j=0;j<MAX;j++
)
最小生成树的数据结构实现            cost[i][j]
=0
;
最小生成树的数据结构实现    printf(
"input the ver and arc "
);
最小生成树的数据结构实现    scanf(
"%d %d",&ver,&
arc);
最小生成树的数据结构实现    
for(i=0;i<arc;i++
)
最小生成树的数据结构实现最小生成树的数据结构实现    
{
最小生成树的数据结构实现        scanf(
"%d %d %d",&a,&b,&
c);
最小生成树的数据结构实现        cost[a][b]
=
c;
最小生成树的数据结构实现        cost[b][a]
=
c;
最小生成树的数据结构实现    }

最小生成树的数据结构实现    
for(i=0;i<ver;i++)
最小生成树的数据结构实现最小生成树的数据结构实现    
{
最小生成树的数据结构实现        
for(j=0;j<ver;j++
)
最小生成树的数据结构实现            printf(
"%d"
,cost[i][j]);
最小生成树的数据结构实现        printf(
" "
);
最小生成树的数据结构实现    }

最小生成树的数据结构实现    prim(cost,ver,
0);
最小生成树的数据结构实现    Kruskal(cost,ver,
0
);
最小生成树的数据结构实现    
return 0
;
最小生成树的数据结构实现}