题目

有 \(k\) 个盒子, 第 \(i\) 个盒子有 \(n_i\) 个数. 保证所有数互不相同。

从每个盒子各拿出一个数, 并按照某种顺序放回去(每个盒子恰好放入一个数)。

判断是否能使操作后所有盒子内的数的和相同, 有解需要输出任意一个方案。

\(k\leq 15,n_i\leq 5000\)


分析

可以发现拿出一个数,那么放进去的这个数也是确定的,那么这样就确定的有向的关系。

由于每个点只往外连一条边,所以这张有向图实则形成一个内向基环树。

相当于要将所有的环抽出来,可以作为一种子方案,然后再将所有环拼接起来,相当于枚举子集。

时间复杂度为 \(O(3^k+2^k*k)\)

可以先跑一遍拓扑排序将非环的部分剔除掉,然后只找环的部分,注意如果环内存在两个数在同一盒子且并不相同,那么这个环不能使用。


代码

#include <cstdio>
#include <cctype>
#include <queue>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
const int N=80101; vector<int>ans[N]; map<long long,int>dfn; queue<int>q;
int xo[N],deg[N],nxt[N],v[N],n,al,a[16][N>>4],S,tot,X[N],Y[N],pre[N]; long long s[16],sum;
int iut(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
int main(){
n=iut(),al=(1<<n)-1;
for (int i=1;i<=al;++i) xo[i]=xo[i&(i-1)]+1;
for (int i=1;i<=n;++i){
a[i][0]=iut();
for (int j=1;j<=a[i][0];++j){
a[i][j]=iut(),s[i]+=a[i][j];
dfn[a[i][j]]=++tot;
X[tot]=i,Y[tot]=j;
}
sum+=s[i];
}
if (sum%n) return !printf("No");
sum/=n;
for (int i=1;i<=n;++i){
for (int j=1;j<=a[i][0];++j)
if (dfn.count(sum-(s[i]-a[i][j]))){
int x=dfn[a[i][j]],y=dfn[sum-(s[i]-a[i][j])];
if (X[x]==X[y]&&Y[x]!=Y[y]) continue;
nxt[x]=y,++deg[y];
}
}
for (int i=1;i<=tot;++i) if (!deg[i]) q.push(i);
while (!q.empty()){
int x=q.front(); q.pop();
if (nxt[x]&&!(--deg[nxt[x]])) q.push(nxt[x]);
}
for (int i=1,flag;i<=tot;++i)
if (deg[i]&&!v[i]){
S=1<<(X[i]-1),flag=v[i]=1,pre[nxt[i]]=i;
for (int x=nxt[i];x!=i;x=nxt[x]){
if ((S>>(X[x]-1))&1) flag=0;
pre[nxt[x]]=x,v[x]=1,S|=1<<(X[x]-1);
}
if (!flag||!ans[S].empty()) continue;
ans[S].push_back(i);
for (int x=nxt[i];x!=i;x=nxt[x]) ans[S].push_back(x);
}
for (int i=1;i<=al;++i)
if (ans[i].empty()){
for (int j=i&(i-1);j;j=(j-1)&i)
if (!ans[j].empty()&&!ans[i^j].empty()){
ans[i]=ans[i^j];
for (int k=0;k<xo[j];++k)
ans[i].push_back(ans[j][k]);
}
}
if (ans[al].empty()) return !printf("No");
sort(ans[al].begin(),ans[al].end());
printf("Yes\n");
for (int i=0;i<n;++i){
int now=ans[al][i];
printf("%d %d\n",a[X[now]][Y[now]],X[pre[now]]);
}
return 0;
}

#状压dp,拓扑排序,内向基环树#CF1242C Sum Balance的更多相关文章

  1. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

    2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1572  Solved: 7 ...

  2. 【XSY3042】石像 拓扑排序 状压DP 洲阁筛

    题目大意 有 \(n\) 个整数 \(a_1,a_2,\ldots,a_n\),每个数的范围是 \([1,m]\).还有 \(k\) 个限制,每个限制 \(x_i,y_i\) 表示 \(a_{x_i} ...

  3. HDU 4917 Permutation(拓扑排序 + 状压DP + 组合数)

    题目链接 Permutation 题目大意:给出n,和m个关系,每个关系为ai必须排在bi的前面,求符合要求的n的全排列的个数. 数据规模为n <= 40,m <= 20. 直接状压DP空 ...

  4. 【62测试】【状压dp】【dfs序】【线段树】

    第一题: 给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去. 比如,BBRB则会形成 BBRBBBRBBBRB 现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标 ...

  5. bzoj 4006 [JLOI2015]管道连接(斯坦纳树+状压DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4006 [题意] 给定n点m边的图,连接边(u,v)需要花费w,问满足使k个点中同颜色的 ...

  6. 51nod 1673 树有几多愁——虚树+状压DP

    题目:http://www.51nod.com/Challenge/Problem.html#!#problemId=1673 建一个虚树. 一种贪心的想法是把较小的值填到叶子上,这样一个小值限制到的 ...

  7. bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp

    给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...

  8. 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...

  9. BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*

    BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...

  10. luogu4294 [WC2008]游览计划(状压DP/斯坦纳树)

    link 题目大意:给定一个网格图,有些点是关键点,选择格点有代价,求把所有关键点联通的最小代价 斯坦纳树模板题 斯坦纳树问题:给定一个图结构,有一些点是关键点,求把这些关键点联通的最小代价e 斯坦纳 ...

随机推荐

  1. golang常用库包:redis操作库go-redis使用(03)-高级数据结构和其它特性

    Redis 高级数据结构操作和其它特性 第一篇:go-redis使用,介绍Redis基本数据结构和其他特性,以及 go-redis 连接到Redis https://www.cnblogs.com/j ...

  2. 探秘C语言数组:解锁高效数据管理与多维空间编程技巧"

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 引言 前面贝蒂给大家介绍了选择结构与循环结构,今天,贝蒂准备给大家介绍C语言中一个非常重要 ...

  3. django项目中使用nginx+fastdfs上传图片和使用图片的流程

    自定义文件存储类 1.先弄清楚django中默认的上传文件存储FileSystemStorage类 https://docs.djangoproject.com/zh-hans/2.2/ref/fil ...

  4. 都说了别用BeanUtils.copyProperties,这不翻车了吧

    分享是最有效的学习方式. 博客:https://blog.ktdaddy.com/ 故事 新年新气象,小猫也是踏上了新年新征程,自从小猫按照老猫给的建议[系统梳理大法]完完整整地梳理完毕系统之后,小猫 ...

  5. 【ACM专项练习#03】打印图形、栈的合法性、链表操作、dp实例

    运营商活动 题目描述 小明每天的话费是1元,运营商做活动,手机每充值K元就可以获赠1元,一开始小明充值M元,问最多可以用多少天? 注意赠送的话费也可以参与到奖励规则中 输入 输入包括多个测试实例.每个 ...

  6. 一款开源、免费、跨平台的Redis可视化管理工具

    前言 经常有小伙伴在技术群里问:有什么好用的Redis可视化管理工具推荐的吗?, 今天大姚给大家分享一款我一直在用的开源.免费(MIT License).跨平台的Redis可视化管理工具:Anothe ...

  7. 协议 UARST & 数据发送与接收

    STM32具有的协议 UASRT是通用异步/同步收发器,UART是通用异步收发器 串口空闲状态时高电平,开始传输数据时,第一个数据为固定的低电平: 数据:最后为高电平的停止位 奇偶校验:通过+1或者不 ...

  8. 分布式理论 & RPC & Dubbo

    分布式服务框架(RPC) 用于提高机器利用率的资源调度和治理中心*(SOA)[ Service Oriented Architecture] Dubbo(RPC框架) 服务提供者**(Provider ...

  9. pcm5102芯片解析之基本概念

    一 前记 1 在音频领域深耕,那就要不断的前行.最近有几个项目需要用到pcm5102这颗料,藉此机会,针对这个料进行深入的研究一下.做一一些简要的分析. 二 概念 音频芯片的指标,其实,很多年都没啥变 ...

  10. python 文件操作常用方法

    一 python文件创建 import os import argparse def file_write(file_name,msg): f = open(file_name,"a&quo ...