HDU1162最小生成树MST

HDU1162最小生成树MST
求MST两种算法:Prim和Kruskal。Prim以点作为主体,Kruskal以边作为主体。
#include  < iostream >
#include 
< cmath >

using   namespace  std;


const   int  M = 101 ;
const   double  MAX = 10000000 ;

struct  S
{
    
double  x,y;
}data[M];

double  map[M][M];
double  dis[M];  // 存储i节点到当前节点的最短距离
int  n;
double  res;  // 结果

double  d(S a,S b)
{
    
return  sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

void  prim( int  v)
{
    
int  i,j,t;
    
double  min;
    
for (i = 1 ;i <= n;i ++ )
        dis[i]
= map[v][i];
    dis[v]
= 0 ;         // 标记已访问
    res = 0 ;
    
for (t = 1 ;t < n;t ++ // 找点
    {
        min
= MAX;
        
for (i = 1 ;i <= n;i ++ )
            
if (dis[i] < min  &&  dis[i] != 0 // 找到未访问过的到当前节点最短的点
            {
                min
= dis[i];
                j
= i;
            }
        res
+= min;
        dis[j]
= 0 ;
        
for (i = 1 ;i <= n;i ++ )             // 更新dis数组
             if (map[j][i] < dis[i])
                dis[i]
= map[j][i];
    }
}

int  main()
{
    
int  i,j;
    
while (scanf( " %d " , & n) != EOF)
    {
        
for (i = 1 ;i <= n;i ++ )
            scanf(
" %lf %lf " , & data[i].x, & data[i].y);
        
for (i = 1 ;i <= n;i ++ )
            
for (j = 1 ;j <= n;j ++ )
                map[i][j]
= d(data[i],data[j]);
        prim(
1 );
        printf(
" %.2lf\n " ,res);
    }
    
return   0 ;
}


你可能感兴趣的:(HDU1162最小生成树MST)