题干:

大黑山上有小小民和小小涛两种物种,山东人小李想要研究这两种物种的关系

奇怪的是大黑山上有相同数量的小小民和小小涛。小李数了数一共有 P 个,小李分别给P个小小民和小小涛编号 1 - P 号,已知每对小小民之间都是好朋友,每对小小涛之间也都是好朋友,但是 i 号小小民和 j 号小小涛不一定是好朋友

山东人小李想要知道在这个物种间最大的友好群体的物种数量(在这个群体中任意两个生物都是好朋友),你能帮小李解决这个难题嘛?

Input

第一行一个整数T,代表测试数据数量

每个测试数据第一行有两个整数 P N ,大黑山上小小民或者小小涛的数量 P ,和他们之间有 N 个关系 ( 1<= P <=20 ),( 0<= N <= P^2 )

接下来 N 行每行两个整数 mi ti 表示 mi 编号的小小民和 ti 编号的小小涛是好朋友

Output

对于每个测试数据,输出一个整数表示最大的友好群体中生物的数量

Sample Input

2
4 5
1 2
2 2
3 2
4 2
1 4
3 4
1 2
2 1
1 1
2 2

Sample Output

5
4

解题报告:

直接跑补图最大独立集就行了=二分图中顶点数-最小点覆盖。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
int p,n;
bool line[22][22];
int nxt[22];
int use[22];
bool find(int x) {for(int i = 1; i<=p; i++) {if(line[x][i] && use[i] == 0) {use[i] = 1;if(nxt[i] == 0 || find(nxt[i])) {nxt[i] = x;return 1;}} }return 0 ;
}
int match() {int res = 0;for(int i = 1; i<=p; i++) {memset(use,0,sizeof use);if(find(i)) res++;}return res;
}
int main()
{int t;cin>>t;while(t--) {memset(line,1,sizeof line);memset(nxt,0,sizeof nxt);scanf("%d%d",&p,&n);for(int a,b,i = 1; i<=n; i++) {scanf("%d%d",&a,&b);line[a][b]=0;}printf("%d\n",2*p-match());} return 0 ;
}

法二:(1400ms竟然能过)

状压dp,复杂度O(n*2^n)枚举

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
const int MAX = 2e5 + 5;
int bit[22];
int lowbit(int x) {return x&-x;}
int main()
{int t,p,n;cin>>t;while(t--) {scanf("%d%d",&p,&n);memset(bit,0,sizeof bit);for(int a,b,i = 1; i<=n; i++) {scanf("%d%d",&a,&b);a--;b--;bit[a] |= 1<<b;}int up = 1<<p,ans = 0;for(int sta = 0; sta<up; sta++) {//枚举选择了哪些男生 int tmp = up-1;//记录当前男生情况下可以获得的所有女生 for(int i = 0; i<p; i++) {if(sta&(1<<i)) tmp &= bit[i];}int sum = 0;for(int i = tmp; i!=0; i-=lowbit(i)) {sum++;}for(int i = sta; i!=0; i-=lowbit(i)) sum++;            ans = max(ans,sum);}printf("%d\n",ans);}return 0 ;
}

【Gym - 101915D】Largest Group(二分图最大团,状压dp)相关推荐

  1. HDU 5304 Eastest Magical Day Seep Group's Summer(状压DP+环缩点+生成树计数)

    题意:给出一个图m条边和n个顶点,要求删除m-n条边使得原图联通,问有多少种方法. 思路:显然删除后的图是由一棵树和额外的一条边组成的,如果只有树那么可以用MATRIX-TREE定理求出生成树的数量, ...

  2. hdu5304 Eastest Magical Day Seep Group#39;s Summer 状压dp+生成树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5304 16个点的无向图,问能生成多少个n条边的连通图.(即多一条边的树) 先n^3 * 2^n 枚举全部的 ...

  3. Codeforces Gym 100676G Training Camp 状压dp

    http://codeforces.com/gym/100676 题目大意是告诉你要修n门课,每门课有一个权值w[i], 在第k天修该课程讲获得k*w[i]的学习点数,给出了课程与先修课程的关系,要修 ...

  4. Gym - 101853E E. Maximum Sum (状压DP)

    原题地址:https://codeforces.com/gym/101853/problem/E 题意:给出一个n*n的矩阵,矩阵中每一个格子都有一个权值,选择一个格子就能拿到当前的权值,但是同时就不 ...

  5. hdu5304 Eastest Magical Day Seep Group's Summer 状压dp+生成树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5304 16个点的无向图,问能生成多少个n条边的连通图.(即多一条边的树) 先n^3 * 2^n 枚举所有的 ...

  6. CSUST 2007-我爱吃烧烤(状压DP)

    题目链接:http://acm.csust.edu.cn/problem/2007 博客园食用链接:https://www.cnblogs.com/lonely-wind-/p/13395416.ht ...

  7. 牛客推荐系统开发之选飞行棋子(状压dp)

    链接:登录-专业IT笔试面试备考平台_牛客网 牛客的新开发的推荐系统使得牛客的DAU(日活跃用户数量)上升了一个档次,于是牛客的老板组织了一场团建.在团建时,牛牛.牛妹.王清楚和茶山牛四人想要愉快地玩 ...

  8. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  9. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

最新文章

  1. __bridge 使用注意
  2. javascript 内部函数的定义及调用
  3. matlab绘制X,Y二维散点图并标出序号
  4. 创建安卓模拟器的两种方式及常用Android命令介绍
  5. js作用域与作用域链
  6. 在NAS上基础构建云存储系统的两种解决方案
  7. BUG——Celery ValueError: not enough values to unpack
  8. windows之临时文件
  9. C/C++函数调用方式
  10. CodeBlock代码替换
  11. EasyCVR接入华为视频云系统查询集群编码和查询网关
  12. 央行企业征信异议处理条件及流程
  13. LeetCode 1114:按序打印
  14. 【数据结构】之排序算法综合篇
  15. 【论文速读】【金融】Predicting stock and stock price index movement using ... and machine learning techniques
  16. EMW3080 STC15轻松实现设备上云3(阿里云物联网平台、智能生活开放平台)
  17. vue element 实现table的自动添加列
  18. ubuntu防火墙命令介绍
  19. python模拟萌妹音让室友疯狂吃鸡
  20. 分分钟百万条数据的微博爬虫分析

热门文章

  1. Objective-C 的OOP(下)-类(static)方法、实例方法、overwrite(覆写)、属性(property)...
  2. [轉]Flash/Flex监听浏览器的关闭事件
  3. xfire客户端对返回list很挑剔,所以需要使用泛型。
  4. [剑指offer]面试题第[68-1]题[Leedcode][JAVA][第235题][二叉搜索树的最近公共祖先][递归][BFS]
  5. 计算机信息管理相关课题论文,计算机信息管理课题论文[].doc
  6. 不同型号服务器如何做双击热备,服务器做双机热备教程
  7. 有效数据外含有额外数据_Excel|应用数据有效性规范数据录入
  8. 计算机管理员无法创建密码,找到电脑管理员的密码
  9. linux传文件file,linux文件的传输与压缩快速入门
  10. asterisk for mipsel