题意:

给你N个点的一幅图,初始图中有M条边,每次操作可以使得一个点连接的所有点变成一个团,问你最少多少次操作可以使得整个图变成一个团.

解法:

因为N很小 所以我们可以二进制压缩来表示一个点与其他点之间的关系。二进制的第i位代表标号位i+1的人。例如标号为1的人认识标号为3与5还有7的人,标号为1的二进制压缩结果就为0000000000000000001010101(标号为i的人肯定认识他自身)。

//https://www.cnblogs.com/FxxL/p/8095418.html
#include <iostream>
#include <string.h>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = (1 << 22), maxm = 30; int n, m;
int dp[maxn + 50], key[maxn + 50], str[maxn + 50];
int a[maxm], num;
queue<int> q; void bfs()
{
int now, tmp;
while (!q.empty())
{
now = q.front(); q.pop();
if (now == ((1 << n) - 1))
return;
for (int i = 0; i < n; i++) {
if (now&(1 << i)) {//当前的数的第i位是1,也就是朋友i可以做介绍
tmp = now | a[i];
if (dp[tmp] == 0) {//出现的是没有记录过的数
dp[tmp] = dp[now] + 1;
key[tmp] = i;//记录更新到tmp的状态是通过i做介绍得来的
str[tmp] = now;//记录tmp的是now通过i做介绍得来的,用来记录路径。
q.push(tmp);
}
}
}
}
} int main()
{
int x, y, tmp;
scanf("%d%d", &n, &m);//n个人
memset(a, 0, sizeof(a));
memset(dp, 0, sizeof(dp));
memset(key, -1, sizeof(key));
memset(str, -1, sizeof(str));
for (int i = 0; i < n; i++) {
a[i] |= (1 << i);//第i个人肯定认识他自己
}
for (int i = 1; i <= m; i++)
{
scanf("%d%d", &x, &y);
x--, y--;
a[x] |= (1 << y); //更新每个人与其他人的关系,如果认识就给那一位的人标为1
a[y] |= (1 << x);
}
for (int i = 0; i<n; i++)
{
dp[a[i]] = 1;
key[a[i]] = i;
q.push(a[i]);
}
if (m == n*(n - 1) / 2)
{
printf("0\n");
return 0;
}
bfs();
tmp = (1 << n) - 1;
//回溯求解
while (tmp != -1)
{
++num;
tmp = str[tmp];
}
printf("%d\n", num);
return 0;
}

最新文章

  1. [Python笔记]序列(一)索引、分片
  2. Javascript中apply、call、bind
  3. 【HDU】1847 Good Luck in CET-4 Everybody!
  4. .net 小问题集结
  5. github上所有项目的受欢迎程度排名,包括超大型项目
  6. Gulp实现css、js、图片的压缩以及css、js文件的MD5命名
  7. Lists, Maps and Sets in Java
  8. 设计模式 - 装饰者模式(Decorator Pattern) 具体解释
  9. JS 生成唯一数字
  10. hdu_2604Queuing(快速幂矩阵)
  11. 如何给列表降维?sum()函数的妙用
  12. Flutter 中 JSON 解析
  13. java.io.IOException: No space left on device 错误
  14. 多线程操作的方法(sleep,)setPriority(Thread.MIN_PRIORITY);yield();
  15. CommandLine exe参数
  16. sublime text3:提示 There are no packages available installation 解决方案
  17. WCF 几种错误
  18. HttpClient 教程 (三)
  19. atitit..主流 浏览器 js 引擎 内核 市场份额 attialx总结vOa9
  20. R语言学习笔记(三)

热门文章

  1. Sparc V8
  2. hive执行计划简单分析
  3. 和内嵌的iframe进行通讯
  4. centos7.5下一键安装nginx-1.8.1
  5. 根据map中的某一key进行排序(快速排序实现)
  6. echarts 的 formatter用法
  7. C++中的public、protected和private
  8. ES6 - 报错整理(1): Unexpected end of JSON input while parsing near &#39;...es&quot;:&quot;7.0.0-alpha.11&quot;,&#39;
  9. Android中动态改变Listview中字体的颜色
  10. idea svn提交时,performing vcs refresh时间很长的解决办法