B - A Funny Bipartite Graph

题意:

一个二分图,左右各有n个点,左边第i个点有一个属性mi,它在一个图中的价值为midi,其中di为它在图中的度数(特殊的,如果度数为0,则价值为0),求一个该二分图的子图使得右边的每个点度数都不为0且总价值最小,输出最小价值。如果无解输出−1
有若干个限制条件(i,j)表示子图中左边的点i和j不能同时存在
保证:
原二分图中左边的每个点度数在[1,3]之间。
左边的i点和右边的j点连线当且仅当i ≤ j
n<=18
mi<=100

题解:

参考题解:
文章1
文章2
这个题的思路非常妙
首先根据数据范围确定方法为状压dp
我们既要维护左侧的点,也有维护右侧的点,两侧都是n,我们都用二进制取枚举,那么复杂度就是n * 22n,这样肯定不行,要先办法优化
注意题目中有说左侧的i选右侧的j,当且仅当i<=j,也就是说当我们考虑左侧的第i个点时,左侧的后n-i个还没选,右侧的前i个点必须全选(不然往后再也选不了),也就是说左侧的后n-i位和右侧的前i位都没啥用,所有我们可以将左侧的前i位和右侧的后n-i位拼成一起,这样2n就可以存下,复杂度就是O(n*2n)
这波操作就相当于计组里面将32 位整数乘除法,它把乘数和结果同时存在了一个 64 位整数上
妙哉妙哉
思路很难,代码也很难。。代码之后更新

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int inf = 0x3f3f3f3f;
int dp[2][1<<18];
int val[20], ban[20];
vector<int> g[20];
char s[20];
int n;
void init(){scanf("%d", &n);for(int i = 0; i < n; ++i) g[i].clear();for(int i = 0; i < n; ++i) {scanf("%s", s);for(int j = 0; j < n; ++j) if(s[j] == '1') g[i].push_back(j);}for(int i = 0; i < n; ++i) {scanf("%s", s); ban[i] = 0;for(int j = 0; j < i; ++j) if(s[j] == '1') ban[i] |= (1<<j);}for(int i = 0; i < n; ++i) scanf("%d", &val[i]);
}
int sol(){int cur = 0, nxt = 1;memset(dp, 0x3f, sizeof dp);dp[cur][0] = 0;for(int i = 0; i < n; ++i){for(int mask = 0; mask < (1<<n); ++mask){int lstate = mask&((1<<i)-1);int rstate = mask&((1<<n)-(1<<i));if(dp[cur][mask] == inf) continue;// don't choose iif(rstate>>i&1) dp[nxt][(mask)^(1<<i)] = min(dp[nxt][(mask)^(1<<i)], dp[cur][mask]);if(ban[i]&lstate) continue;//can't choose ifor(int t = 1; t < (1<<g[i].size()); ++t){int cost = 1;int ex = 0;for(int j = 0; j < g[i].size(); ++j){int v = g[i][j];if(t>>j&1) cost *= val[i], ex |= 1<<v;}int nstate = rstate|ex;if( !(nstate>>i&1) ) continue;int sumstate=lstate|nstate;dp[nxt][sumstate] = min(dp[nxt][sumstate], dp[cur][mask] + cost);}}swap(cur, nxt);memset(dp[nxt], 0x3f, sizeof dp[nxt]);}int ans = inf;for(int i = 0; i < (1<<n); ++i) ans = min(ans, dp[cur][i]);if(ans == inf) return -1;return ans;
}
int main()
{int T;cin>>T;while(T--){init();cout<<sol()<<endl;}
}

B - A Funny Bipartite Graph相关推荐

  1. Fast spectral clustering learning with hierarchical bipartite graph for large-scale data

    Fast spectral clustering learning with hierarchical bipartite graph for large-scale data 基于层次二分图的大规模 ...

  2. 二分匹配大总结——Bipartite Graph Matchings[LnJJF]

    文章目录 二分匹配--Bipartite Graph Matchings[LnJJF] 认识:什么是二分图? 理解:现实模型如何与二分图相互转化? 如何判断能否转化? 能够转化的话,如何转化? 应用: ...

  3. Bipartite graph/network学习

    Bipartite graph/network翻译过来就是:二分图. 维基百科中对二分图的介绍为:二分图是一类图(G,E),其中G是顶点的集合,E为边的集合,并且G可以分成两个不相交的集合U和V,E中 ...

  4. Bipartite Graph Based Multi-View Clustering

    Bipartite Graph Based Multi-View Clustering 基于二部图的多视图聚类 abstract 对于基于图的多视图聚类,一个关键问题是通过两阶段学习方案捕获共识聚类结 ...

  5. C#,图论与图算法,二分图(Bipartite Graph)的霍普克罗夫特-卡普(Hopcroft Karp)最大匹配算法与源程序

    二分图Bipartite graph 有没有可能通过数学过程找到你的灵魂伴侣?大概让我们一起探索吧! 假设有两组人注册了约会服务.在他们注册后,会向他们展示另一组人的图像并给出他们的描述.他们被要求选 ...

  6. Bipartite Graph多视图学习聚类文章总结

    看了一些anchor graph和bipartite graph 的文章始终不知道他们的区别在哪里.今天总结一下这类文章. 1.能看到最早的这类关于多视图学习的文章 Large-Scale Multi ...

  7. 论文阅读 [TPAMI-2022] Multiview Clustering: A Scalable and Parameter-Free Bipartite Graph Fusion Method

    论文阅读 [TPAMI-2022] Multiview Clustering: A Scalable and Parameter-Free Bipartite Graph Fusion Method ...

  8. CF600F:Edge coloring of bipartite graph(二分图、构造)

    解析 首先大胆猜结论:答案就是最大的点度数 考虑如何构造 设一个点联通的边的颜色集合为S,由题意得S中的元素不可重 假设新加入一条边(u,v) 设c1=mex(Su),c2=mex(Sv)c1=mex ...

  9. hdu5354 Bipartite Graph

    分治+并查集.假设要求[L,mid]的答案,那么很明显,如果一条边的两个端点都>mid的话或者一个端点>mid一个端点<L,说明询问[L,mid]这个区间中任何一点时候,这一条边都是 ...

最新文章

  1. 使用NetworkX绘制深度神经网络结构图(Python)
  2. python enumerate()用法
  3. 为什么说百度教育大脑3.0,是中国教育迎来的真正智慧大脑?
  4. WPF-MVVM学习心德(WinForm转WPF心德)
  5. rabbitmq的安装和使用
  6. 改成中文版的_lol手游怎么改成中文版?英雄联盟手游中文版更改教程
  7. 一段顺序颠倒能读通的文字_钓鱼也有逻辑顺序,总是钓不到鱼的原因就在这里...
  8. Linux用户管理命令详解,useradd、passwd
  9. 获取url中带的参数
  10. System x 服务器制作ServerGuide U盘安装Windows Server 2003 操作系统
  11. 5.13 综合案例2.0-火焰检测系统(2.2版本接口有更新)
  12. cuda历史版本下载
  13. win10计算机快捷键设置,win10计算器快捷键设置_w10电脑计算器快捷键怎么添加-win7之家...
  14. 【工控老马】基于MODBUS协议的上位机与PLC及智能仪表之间的通信实现方法
  15. vue自定义封装全局组件与使用
  16. 企业债和公司债的四点区别
  17. 学习游戏开发,有哪些常识需要了解
  18. Windows简体系统和繁体系统下的乱码处理
  19. spring框架学习 - 使用 Spring 的面向切面编程 补充1
  20. outlook添加腾讯企业邮箱报错:无法访问此账户 可能需要更新密码或授予账户同步到此设备的权限

热门文章

  1. 你知道长颈鹿是怎么睡觉的吗? | 今日趣图
  2. 一晚啪了5只喵,累到在医院打点滴,这中国喵把英国人看傻了 | 今日最佳
  3. 世纪渣男何书桓! | 今日最佳
  4. 通过简单的Word Count讲解MapReduce原理以及Java实现
  5. python tkinter进度条_在python3.7中更新tkinter进度条
  6. 小肚皮最新版本_小肚皮官方版下载_小肚皮app - Win7旗舰版
  7. 利用计算机制作多媒体最后一步,福建省高中会考 多媒体技术应用 选择题专项练习十一(201206)(有答案)...
  8. 查看服务器物理内存大小,如何看服务器的物理内存大小
  9. java对象实例_深入理解Java对象实例生成的例子!(转)
  10. git push被拒绝_规范git项目提交并自动生成项目commit log