题意就是:

一个猎人在森林里捕猎。

然后有只猴子,喜欢躲树的后边,猎人看不见它

然后给出了一张图,表示有哪些树是相邻的。

数据保证任意图中两个树都可以直接或间接的到达

猎人有一个枪,每次他可以选择一颗树,然后射子弹。如果猴子躲那个树后边,就被打死了。

但是如果没躲那个树后边,猴子会利用猎人换子弹的时间立刻蹦到这个树相邻的树上躲藏,

问猎人应该怎样击打树才能保证必然能击打中猴子。

比如第一个样例,

猎人只要在0号树上击打两次即可,因为猴子如果没被打中,必然会往旁边的树跑

然后可以看到的是

n的范围很小。

可以考虑使用状态压缩DP

刚开始因为猴子是有可能出现在所有树上的。

所以状态为(1 << n) - 1

我们的目标是 让猴子出现的可能消灭为0状态

对于猴子每次枪响后转移

对于一个点,必然是其周围所有的点都有可能会跳到这个点上

那么我们每次先将猴子转移后的状态求出来。

选择一个尽量小的点毙掉这颗树上的猴子。

因为没有什么顺序

所以将状态加入队列中来转移

如果转移到了0状态。

因为我们每次都尽量小的点去毙掉

所以能保证字典序,中间过程记录下路径,最后输出即可

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <queue>
#include <vector>
#define eps 1e-8
#define INF 111111111
using namespace std ;
int n, m;
queue<int>q;
vector<int>res;
int st[33];
int pre[(1 << 21) + 5];
int num[(1 << 21) + 5];
int gao()
{
q.push((1 << n) - 1); while(!q.empty())
{
int u = q.front();
q.pop();
int nxt = 0;
for(int i = 0; i < n; i++)
{
if(u & (1 << i))
nxt |= st[i];
}
for(int i = 0; i < n; i++)
if(nxt & (1 << i))
{
int k = nxt ^ (1 << i);
if(pre[k] == -1)
{
pre[k] = u;
num[k] = i;
q.push(k);
if(k == 0) return 1;
}
}
}
return 0;
}
int main()
{
int x, y;
while(scanf("%d%d", &n, &m) != EOF)
{
if(!n && !m) break;
memset(st, 0, sizeof(st));
while(!q.empty()) q.pop();
for(int i = 0; i < m; i++)
{
scanf("%d%d", &x, &y);
st[x] |= (1 << y);
st[y] |= (1 << x);
}
if(n == 1)
{
printf("1: 0\n");
continue;
}
if(m >= n)
{
puts("Impossible");
continue;
}
memset(pre, -1, sizeof(pre));
int k = gao();
if(k == 0)
puts("Impossible");
else
{
res.clear();
int top = 0;
while(top != (1 << n) - 1)
{
res.push_back(num[top]);
top = pre[top];
}
printf("%d:", res.size());
for(int i = res.size() - 1; i >= 0; i--) printf(" %d", res[i]);
puts("");
}
}
return 0;
}

UVALive 4959 Jumping monkey的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. 2021CCPC网络赛(重赛)题解

    自己还是太菜了,五个小时一个题也没磕出来,还是队友牛逼!... Primality Test 先看这个题,可能一上去就被\(\frac{f(x)+f(f(x))}{2}\)向下取整吓住了,但仔细想想, ...

  3. Monkey Tradition(中国剩余定理)

    Monkey Tradition Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Submi ...

  4. (light oj 1319) Monkey Tradition 中国剩余定理(CRT)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1319 In 'MonkeyLand', there is a traditional ...

  5. 1319 - Monkey Tradition

    1319 - Monkey Tradition   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  6. 【初学python】使用python调用monkey测试

    目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...

  7. Monkey Patch/Monkey Testing/Duck Typing/Duck Test

    Monkey Patch Monkey Testing Duck Typing Duck Test

  8. monkey命令选项参考

    基本参数:     --help              打印帮助消息 -v  可以在命令行中出现多次,每次一个-V选项都会增加monkey向命令行打印输出的详细级别.默认的级别0只会打印启动信息. ...

  9. monkey之monkey日志分析

    一.初步分析方法:Monkey测试出现错误后,一般的差错步骤为以下几步:1.找到是monkey里面的哪个地方出错2.查看Monkey里面出错前的一些事件动作,并手动执行该动作3.若以上步骤还不能找出, ...

随机推荐

  1. HDU 5119 Happy Matt Friends(dp+位运算)

    题意:给定n个数,从中分别取出0个,1个,2个...n个,并把他们异或起来,求大于m个总的取法. 思路:dp,背包思想,考虑第i个数,取或者不取,dp[i][j]表示在第i个数时,异或值为j的所有取法 ...

  2. python小练习,打出1-100之间的所有偶数,设计一个函数,在桌面上创建10个文件,并以数字命名,复利计算函数

    练习一:打出1-100之间的所有偶数 def even_print(): for i in range(1,101): if i % 2 == 0: print (i) even_print() #列 ...

  3. 异步tcp通信——APM.Server 消息推送服务的实现

    消息推送服务 服务器推送目前流行就是私信.发布/订阅等模式,基本上都是基于会话映射,消息对列等技术实现的:高性能.分布式可以如下解决:会话映射可采用redis cluster等技术实现,消息对列可使用 ...

  4. ASP.NET面试

    1.net中读写数据库需要用到那些类?他们的作用都是什么?答:DataSet:数据存储器.DataCommand:执行语句命令.DataAdapter:数据的集合,用语填充.2.介绍一下什么是Code ...

  5. 用CSS3实现带小三角形的div框(不用图片)

    现在看到了很多带小三角形的方框,如微信.Mac版的QQ.QQ空间的时间轴等等,在聊天或者是发表的状态的内容外面都有一个带小三角形的矩形框包围着,感觉看着很不错,于是决定亲自动手写一个,我上次用的是偏移 ...

  6. 计时器(Chronometer)的使用

    安卓提供了一个计时器组件:Chronometer,该组件extends TextView,因此都会显示一段文本,但是它显示的时间是从某个起始时间开始过去了多少时间,它只提供了android:forma ...

  7. CSP内容安全策略

    在浏览网页的过程中,尤其是移动端的网页,经常看到有很多无关的广告,其实大部分广告都是所在的网络劫持了网站响应的内容,并在其中植入了广告代码.为了防止这种情况发生,我们可以使用CSP来快速的阻止这种广告 ...

  8. 试用ubuntu-12.04.3-desktop-amd64

    由于工作需要,终于要开始使用大名鼎鼎的ubuntu了,从网上下了个ubuntu-12.04.3-desktop-amd64,通过vmware安装,过程相当顺利,只是装完后重启动,发现回到了命令行模式. ...

  9. [转]JS继承的5种实现方式

    参考链接: http://yahaitt.iteye.com/blog/250338 虽说书上都讲过继承的方式方法,但这些东西每看一遍都多少有点新收获,所以单独拿出来放着. 1. 对象冒充 funct ...

  10. python之map和filter

    li = [11,22,33,44,55,66] ret = filter(lambda a:a>33,li) print(list(ret)) ret2 = map(lambda a:a+10 ...