ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode 1584.连接所有点的最小费用

2021-06-19 12:36:00  阅读:283  来源: 互联网

标签:return temp int mincost 最小 1584 fa 1007 leetcode


  “任意两点之间 有且仅有一条简单路径时,返回将所有点连接的最小总费用”,即求MST(最小生成树)。

  发现数据规模不超过1000,所以可以考虑到$O(n^2)$的算法。

  $O(n^2)$算出任意两点的距离。然后用prim算最小生成树,同样$O(n^2)$。(这张图是稠密图,点数$n$远小于边数$n^2$,所以不用Kruskal)

const int inf=2100000000;

int n;
int fa[1007],mincost[1007];

int d[1007][1007];
int abs(int temp){
    return temp>0?temp:(0-temp);
}

int find(int a){
    return fa[a]==a?a:fa[a]=find(fa[a]);
}

class Solution {
public:
    int minCostConnectPoints(vector<vector<int>>& points) {
        n=points.size();    
        for (int i=1;i<=n;i++)
            fa[i]=i,mincost[i]=inf;
        for (int i=0;i<n;i++)
            for (int j=0;j<n;j++)
                if (i!=j)
                    d[i+1][j+1]=abs(points[i][0]-points[j][0])+abs(points[i][1]-points[j][1]),d[j+1][i+1]=d[i+1][j+1];
        mincost[1]=0;
        int now=1,result=0,task=1;
        while (task<n){
            int temp=inf,p=0;
            for (int i=1;i<=n;i++)
                if (now!=i&&mincost[i]){
                    if (d[now][i]<mincost[i])
                        mincost[i]=d[now][i];
                    if (temp>mincost[i])
                        temp=mincost[i],p=i;
                }
            task++,result+=temp,now=p,mincost[p]=0;
        }
        return result;
    }
};

 

标签:return,temp,int,mincost,最小,1584,fa,1007,leetcode
来源: https://www.cnblogs.com/wegret/p/14902572.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有