连通两组点的最小成本

Posted 929code

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连通两组点的最小成本相关的知识,希望对你有一定的参考价值。

如果两个组中的每个点都与另一组中的一个或多个点连接,则称这两组点是连通的
返回连通两组点所需的最小成本

1. 状态压缩 + 动态规划

class Solution 
public:
    int connectTwoGroups(vector<vector<int>>& cost) 
        //这里使用状态压缩记录连通状态,同时使用动态规划最优化
        int m = cost.size(); int n = cost[0].size();
        vector<vector<int>> dp(m+1,vector<int>(1<<n,INT_MAX/2));//dp[i][j]表示s1前i个点与j状态下的s2的最小连通成本
        dp[0][0] = 0;//初始成本为0 , 无法连通成本无穷大
        for(int i=1;i<=m;i++) //遍历点集1
            //将新增点与集合2所有状态连通
            for(int mask=0;mask<(1<<n);mask++) //遍历点集2的所有状态,递推计算对应状态下最小代价
                for(int k=0;k<n;k++)//处理对应状态的每一个点
                    if(mask&(1<<k)==0) continue; //对应点不在状态中,跳过
                    //尝试将新增点1与点2连通
                    dp[i][mask] = min(dp[i][mask], dp[i][mask^(1<<k)] + cost[i-1][k]);  //新增点1可能会连通集合2中其它点
                    dp[i][mask] = min(dp[i][mask], dp[i-1][mask] + cost[i-1][k]);   //新增点1重复连通点2 , 用于新增点的连通
                    dp[i][mask] = min(dp[i][mask], dp[i-1][mask^(1<<k)] + cost[i-1][k]);  //新增点1和点2仅连通彼此
                
            
        
        return dp[m][(1<<n)-1]; //返回所有点连通的最小代价
    
;

以上是关于连通两组点的最小成本的主要内容,如果未能解决你的问题,请参考以下文章

两组点之间的最佳匹配

向量化计算numpy中一组点的所有单位向量

在c ++中查找包含一组点的最小面积椭圆

最接近一组点的线[重复]

包含一组点的多边形

环形环绕地图上一组点之间的“质心”,可最大限度地减少到所有点的平均距离