prim解决最小生成树问题

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
using namespace std;

const int MAXV = 1000;//最大顶点数
const int INF = 1000000000;

//n为顶点数
//MAXV为最大顶点数
int n,m;
double G[MAXV][MAXV];
double d[MAXV];// 顶点到集合S的最短距离
bool vis[MAXV] = {false};//标记数组,vis[i] == true表示已访问

double prim()
{
    fill(d,d+MAXV,INF);
    d[0] = 0;//只有0号顶点到集合s的距离为0,其他全为INF
    double ans = 0;//存放最小生成树的边权之和

    //找n个点
    for(int i=0;i<n;i++)
    {
        int u = -1,MIN = INF;//u使d[u]最小,MIN存放该最小的d[u]

        //每次找一个到集合距离最小的点
        for(int j = 0;j < n;j++)
        {
            if(vis[j] == false && d[j] < MIN)
            {
                u = j;

                MIN = d[j];
            }
         } 

         if( u== -1 )
         {
             return -1;
         } 

         //标记u为已访问
         vis[u] = true;

         ans += d[u];

         for(int v=0;v < n;v++)
         {
             //如果v未访问,且u能到达v,并且以u为中转可以是v离集合更近
             if(vis[v] == false && G[u][v] != INF && G[u][v] < d[v])
             {
                 d[v] = G[u][v] ;
            }
         }
    }

    return ans;
 } 

 struct point
 {
     int x;
     int y;
 };

 point p[MAXV];

 double getDis(point &a,point &b)
 {
     return sqrt( (a.x - b.x)*(a.x - b.x)  + (a.y - b.y)*(a.y - b.y));
 }

 int main()
 {
     cin >> n;

     for(int i=0;i<n;i++)
     {
         cin >> p[i].x;
        cin >> p[i].y;
    }
     //初始化图G
     fill(G[0],G[0] + MAXV * MAXV,INF);

     for(int i=0;i<m;i++)
     {
         cin >> p[i].x;
         cin >> p[i].y;
    }

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            G[i][j] = getDis(p[i],p[j]);
        }
    }

     double ans = prim();

     printf("%.2f \n",ans);
     return 0;
 }

原文地址:https://www.cnblogs.com/xiaochi/p/10415314.html

时间: 2024-10-10 06:46:29

prim解决最小生成树问题的相关文章

普里姆算法(Prim)与最小生成树问题

普里姆算法 @anthor:QYX 普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类). 对于给定的连通网,起始状态全部顶点都归为 B 类.在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类:然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止.所走过的顶点和边就是该连通图的最小生成树. 例如,通过普里姆算法查找图 2(a)

hdu1863 畅通工程2 还是用并查集思想解决最小生成树问题

http://acm.hdu.edu.cn/showproblem.php?pid=1863 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的选拔 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 19994    Accepted Submission(s): 8528

最小生成树问题

最小生成树问题 #include <iostream> using namespace std; #define MAX 20 #define INF 32767 int edges[MAX][MAX]; void prim(int v,int arr[MAX][MAX]) { int n=8; int lowcost[MAX]; int min; int closest[MAX],i,j,k; for(i=0;i<n;i++) { lowcost[i]=arr[v][i]; close

关于最小生成树问题

我们通过一个例子来看一下最小生成树的求法. 分别用普里姆算法(从A结点开始)和克鲁斯卡尔算法计算下图的最小生成树. ok,首先运用Prim算法进行计算: U V-U B C D E F TE {A} {B,C,D,E,F} AB 11 AC 13 ~ ∞ AE 16 ~ ∞ AB 11 {A,B} {C,D,E,F}   BC 7 BD 3 AE 16 BF 5 BD 3 {A,B,D} {C,E,F}   BC 7   AE 16 BF 5 BF 5 {A,B,D,F} {C,E}   BC

数据结构--图(下)--最小生成树问题

最小生成树问题 村村通中,修路,最少的钱就连通起来了.连通图.最少的边, prim算法 思路是:从根节点开始让一棵小树慢慢长大

浅入浅出数据结构(25)——最小生成树问题

上一篇博文我们提到了图的最短路径问题:http://www.cnblogs.com/mm93/p/8434056.html.而最短路径问题可以说是这样的一个问题:路已经修好了,该怎么从这儿走到那儿?但是在和图有关的问题中,还有另一种有趣的问题:修路的成本已经知道了,该怎么修路才能尽可能节约成本,同时将这些地方都连起来? 比如我们知道有这么几个城市,它们互相之间还没有路: 经过实地考察后,发现可以修的路以及各条路的修路成本如下: 但是我们的预算有限,需要在修路时尽可能的省钱(也就是尽量减小所有边的

[ACM] POJ 3273 Monthly Expense (二分解决最小化最大值)

Monthly Expense Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14158   Accepted: 5697 Description Farmer John is an astounding accounting wizard and has realized he might run out of money to run the farm. He has already calculated and r

POJ 2125 --Destroying The Graph【最小割解决 &quot;最小点权覆盖问题&quot; &amp;&amp; 输出解(割边集) &amp;&amp; 各种不懂】

Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7597   Accepted: 2434   Special Judge Description Alice and Bob play the following game. First, Alice draws some directed graph with N vertices and M arcs. After that B

hdu1533 Going Home km算法解决最小权完美匹配

Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5539    Accepted Submission(s): 2907 Problem Description On a grid map there are n little men and n houses. In each unit time, every l