c语言最小生成树

Python016

c语言最小生成树,第1张

我前段时间写了一个。

你自己改改吧。

#include <stdio.h>

#include <math.h>

struct point

{

double x,y

}

struct distence

{

double _distence

bool islink

}

static double CaculateDistence(point x,point y)

{

return sqrt(pow((x.x-y.x),2.0)+pow((x.y-y.y),2.0))

}

static bool isInGroup(int *group,int value)

{

for(int i=0i<10++i)

{

if(value==group[i]){return true}

}

return false

}

int main()

{

/* 初始化各个点的值 */

point _point[10]={{2.4169,8.2119},{4.0391,0.1540},{0.9645,0.4302},{1.3197,1.6899},{9.4205,6.4912},

{9.5613,7.3172},{5.7521,6.4775},{0.5978,4.5092},{2.3478,5.4701},{3.5316,2.9632}}

/* 初始化距离数组 */

distence _distence[10][10]={0.0,0}

////////////////////////////////////////////////////////////////

/* 计算距离 */

int i,j

for (i=0i<10++i)

{

for(j=0j<10++j)

{

if(i==j)_distence[i][j]._distence=0

else _distence[i][j]._distence=CaculateDistence(_point[i],_point[j])

}

}

////////////////////////////////////////////////////////////////////

int pointgroup[10]={0}

int size=1

pointgroup[0]=0

///////////////////////////////////////////////////////////////

/* 计算最小生成树 */

for(size<10)

{

double dismin=32454.0

int tmpx=0,tmpy=0

for(i=0i<size++i)

{

for(j=0j<10++j)

{

if(_distence[pointgroup[i]][j].islink)continue

else if(pointgroup[i]==j)continue

else if(_distence[pointgroup[i]][j]._distence<dismin &&

!isInGroup(pointgroup,j)){

dismin=

_distence[pointgroup[i]][j]._distence

tmpx=pointgroup[i]

tmpy=j

}

else continue

}

}

_distence[tmpx][tmpy].islink=true

_distence[tmpy][tmpx].islink=true

pointgroup[size]=tmpy

++size

}

//////////////////////打印最小生成树//////////////////////////

for(i=0i<10++i)

{

for(int j=0j<10++j)

{

if(_distence[i][j].islink)printf("%d ------ %d\n",i,j)

}

}

return 0

}

/*

邻接矩阵存储图

测试数据

6 10

1 2 6

1 3 1

1 4 5

2 3 5

2 5 3

3 4 5

3 5 6

3 6 4

4 6 2

5 6 6

*/

#include <stdio.h>

#include <limits.h>

#define N 100

int p[N], key[N], tb[N][N]

void prim(int v, int n)

{

   int i, j

   int min

   for (i = 1 i <= n i++)

   {

       p[i] = v

       key[i] = tb[v][i]

   }

   key[v] = 0

   for (i = 2 i <= n i++)

   {

       min = INT_MAX

       for (j = 1 j <= n j++)

           if (key[j] > 0 && key[j] < min)

           {

                v = j

                min = key[j]

           }

       printf("%d%d ", p[v], v)

       key[v] = 0

       for (j = 1 j <= n j++)

           if (tb[v][j] < key[j])

              p[j] = v, key[j] = tb[v][j]

   }

}

int main()

{

   int n, m

   int i, j

   int u, v, w

   while (scanf("%d%d", &n, &m))

   {

       for(i = 1 i <= n i++)

       {

           for (j = 1 j <= n j++)

               tb[i][j] = INT_MAX

       }

       while (m--)

       {

           scanf("%d%d%d", &u, &v, &w)

           tb[u][v] = tb[v][u] = w

       }

       prim(1, n)

       printf("\n")

   }

   return 0

}