首页 > 其他分享 >连通两组点的最小成本

连通两组点的最小成本

时间:2023-06-20 09:01:49浏览次数:48  
标签:连通 vector int 两组 最小 cost size

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

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]; //返回所有点连通的最小代价
    }
};

标签:连通,vector,int,两组,最小,cost,size
From: https://www.cnblogs.com/929code/p/17492710.html

相关文章

  • 【工程应用八】终极的基于形状匹配方案解决(小模型+预生成模型+无效边缘去除+多尺度+各
      我估摸着这个应该是关于形状匹配或者模版匹配的最后一篇文章了,其实大概是2个多月前这些东西都已经弄完了,只是一直静不下来心整理文章,提醒一点,这篇文章后续可能会有多次修改(但不会重新发文章,而是在后台直接修改或者增加),所以有需要的朋友可以随时重复查看。 这次带来的更新......
  • 取列表或字典最大/最小的前几个
    importheapqa_list=[3,4,2,5,1,6]c_dict={'A':3,'B':4,'C':5}topNum=2print(heapq.nlargest(topNum,a_list))print(heapq.nlargest(topNum,c_dict))print(heapq.nlargest(topNum,c_dict.keys()))print(heapq.nlar......
  • 关于最小生成树
    关于最小生成树目录概述性质Prim算法实现例P1194买礼物Kruskal算法实现思想例P4047部落划分Part1概述一个连通图的生成树是一个极小的连通子图,它包含图中全部的n个顶点,但只有构成一棵树的n-1条边。我们定义无向连通图的最小生成树(MinimumSpannin......
  • POJ2117 Electricity 题解 tarjan点双连通分量 割点
    题目链接:http://poj.org/problem?id=2117题目大意:给定一个由\(n\)个点\(m\)解题思路:tarjan,判断\(u\)的子节点有几个\(v\)满足\(low[v]\gedfn[u]\)就是答案,但是同时如果\(u\)不是这个dfs树的根节点,个数还要加\(1\)。示例程序1(C++11,POJ不支持):#include<bits/stdc++.h>......
  • P2860 [USACO06JAN]Redundant Paths G 题解 tarjan边双连通分量
    题目链接:https://www.luogu.com.cn/problem/P2860题目大意:给定一个无向连通图,求至少加几条边,能使其变成一个边双连通图。解题思路:边双连通分量缩点后计算度数为\(1\)的节点个数,假设有\(cnt\)个,则答案为\((cnt+1)/2\)。示例程序:#include<bits/stdc++.h>usingnamespacestd;......
  • CF402E Strictly Positive Matrix 题解 tarjan强连通分量
    题目链接:http://codeforces.com/problemset/problem/402/E题目大意:给出一个矩阵\(A\),问是否存在一个正整数\(k\)使得\(A^k\)解题思路:根据矩阵的性质,\(A^k_{i,j}\gt0\)当且仅当\(i\)到\(j\)所以可以把矩阵转成图论模型,若\(A_{i,j}\gt0\),则从\(i\)往\(j\)如果所有点......
  • pr怎么渲染导出最小体积的高清视频?
    导出视频主要设置分辨率、帧率、 格式和比特率这4大项目。其中分辨率和帧率是在设置序列的时候就决定了,而格式和比特率是在导出的时候才设置的,其中比特率的设置最为关键,决定了文件大小和清晰度,比特率需要根据分辨率的大小来设置,下面我们就来看看premiere渲染导出体积小又高清视频......
  • C++ 数值最大最小标识符一网打尽,INT_MIN/ INT_MAX/LONG_MIN/LONG_MAX 等等
    ConstantMeaningValueCHAR_BIT Numberofbitsinthesmallestvariablethatisnotabitfield. 8SCHAR_MIN Minimumvalueforavariableoftypesignedchar. -128SCHAR_MAX Maximumvalueforavariableoftypesignedchar. 127UCHAR_MAX Maximumvalueforav......
  • 【剑指Offer】6、旋转数组的最小数字
    【剑指Offer】6、旋转数组的最小数字题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组......
  • POJ2117 Electricity 题解 tarjan点双连通分量 割点
    题目链接:http://poj.org/problem?id=2117题目大意:给定一个由\(n\)个点\(m\)条边构成的无向图,请你求出该图删除一个点之后,连通块最多有多少。解题思路:tarjan,判断\(u\)的子节点有几个\(v\)满足\(low[v]\gedfn[u]\)就是答案,但是同时如果\(u\)不是这个dfs树的根节......