FZU 2093 找兔子 状压DP
题目链接:找兔子
n的范围是[1, 15],可以用0 到 (1<<n)-1 的数表示全部状态,用dp[i] = t表示到达状态i的最少时间是t,对于每个点,如果它能到达的所有点在t秒时都已经确定了会不会有兔纸,那这个点就确定了在(t+1)s会不会有兔纸。对于每个时刻,可以询问<=2个点,所以由初始状态可以搜到最后确定能不能找到兔纸。
我没有想到找不到兔纸的数据...
关键是dp的思想==很巧妙。
附代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue>
#define maxn 16
#define inf 10000000
using namespace std; int edge[maxn]; // 储存每个点的边的信息
int dp[1<<maxn]; // dp[i]表示到达i状态的最少时间,一共有1<<n个状态 i的二进制中1表示已经确定了该点,0表示还没有 int main() {
int t;
cin >> t;
while(t--) {
int n, m;
memset(edge, 0, sizeof(edge));
cin >> n >> m;
for (int i=0; i<=(1<<n); ++i) {
dp[i] = inf;
} for (int i=0; i<m; ++i) {
int x, y;
cin >> x >> y;
x--, y--;
edge[x] |= (1<<y);
edge[y] |= (1<<x);
} for (int i=0; i<n; ++i) {
if (!edge[i]) edge[i] |= (1<<i);
} queue<int>que;
dp[0] = 0;
que.push(0); while(!que.empty()) {
int now = que.front();
que.pop();
int nxt = 0; for (int i=0; i<n; ++i) {
if ((now&edge[i]) == edge[i]) {
nxt |= (1<<i); // 所有当前已经确定的点(不是状态)都保存在了nxt中。
}
} for (int i=0; i<n; ++i) {
for (int j=i+1; j<n; ++j) {
int nxtstu = (nxt|(1<<i)|(1<<j)); //可以确定状态nxtstu 时间选择min
if (dp[nxtstu] > dp[now] + 1) {
dp[nxtstu] = dp[now] + 1;
que.push(nxtstu);// 如果当前状态更新 加入队列以更新它可以到达的状态
}
}
}
} int tot = (1<<n)-1;
int ans = dp[tot]; //全部点都确定的一个状态 for (int i=0; i<n; ++i) {
int stu = (tot^(1<<i)); //每个还有一个点没确定的状态
ans = min(ans, dp[stu]);
} if (ans == inf) {
cout << "-1\n";
}
else cout << ans << endl;
}
return 0;
}
FZU 2093 找兔子 状压DP的更多相关文章
- 没有找零 状压dp
没有找零 状压dp 约翰到商场购物,他的钱包里有K(1 <= K <= 16)个硬币,面值的范围是1..100,000,000.约翰想按顺序买 N个物品(1 <= N <= 1 ...
- [BZOJ3312][USACO]不找零(状压DP)
Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身上 ...
- Codeforces 1383C - String Transformation 2(找性质+状压 dp)
Codeforces 题面传送门 & 洛谷题面传送门 神奇的强迫症效应,一场只要 AC 了 A.B.D.E.F,就一定会把 C 补掉( 感觉这个 C 难度比 D 难度高啊-- 首先考虑对问题进 ...
- FZU 1025 状压dp 摆砖块
云峰菌曾经提到过的黄老师过去讲课时的摆砖块 那时百度了一下题目 想了想并没有想好怎么dp 就扔了 这两天想补动态规划知识 就去FZU做专题 然后又碰到了 就认真的想并且去做了 dp思想都在代码注释里 ...
- FZU - 2218 Simple String Problem 状压dp
FZU - 2218Simple String Problem 题目大意:给一个长度为n含有k个不同字母的串,从中挑选出两个连续的子串,要求两个子串中含有不同的字符,问这样的两个子串长度乘积最大是多少 ...
- Codeforces 1225G - To Make 1(bitset+状压 dp+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 还是做题做太少了啊--碰到这种题一点感觉都没有-- 首先我们来证明一件事情,那就是存在一种合并方式 \(\Leftrightarrow\) ...
- FZU - 2218 Simple String Problem(状压dp)
Simple String Problem Recently, you have found your interest in string theory. Here is an interestin ...
- [luoguP3092] [USACO13NOV]没有找零No Change(状压DP + 二分)
传送门 先通过二分预处理出来,每个硬币在每个商品处最多能往后买多少个商品 直接状压DP即可 f[i]就为,所有比状态i少一个硬币j的状态所能达到的最远距离,在加上硬币j在当前位置所能达到的距离,所有的 ...
- HDU 1074 Doing Homework (状压dp)
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
随机推荐
- Maven聚合与继承
分别为两种不同形式的聚合 相关代码如下: https://github.com/humeng126/account-parent_1 https://github.com/humeng126/acco ...
- HDU5829 NTT
以下这份代码并没有过.但感觉没有问题.不是蜜汁WA就是蜜汁T. #include <cstdio> #include <iostream> #include <cstri ...
- Python学习(22)python网络编程
Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...
- mysql 事务隔离级别
read-uncommitted(未提交读)测试流程:1.A设置read-uncommitted, start transaction2.B执行start transaction,修改一条记录,3.A ...
- openerp安装记录及postgresql数据库问题解决
ubuntu-14.04下openerp安装记录1.安装PostgreSQL 数据库 a.安装 sudo apt-get install postgresql 安装后ubu ...
- 杨辉三角 && 鸽兔同校
杨辉三角: 用个一维数组直接模拟就行,只是 C++ 的高精度调了好久,后来发现能用 python ,于是试着写了写: dp = [] def out(L, end): for i in range(e ...
- Maven——使用Nexus搭建Maven私服
原文:http://www.cnblogs.com/xdp-gacl/p/4068967.html Maven学习总结(九)--使用Nexus搭建Maven私服 一.搭建nexus私服的目的 为什么要 ...
- 加速Eclipse使其成为超快的IDE
按照下述步骤来加速Eclipse为超快的IDE,它适用于32和64位版本的Eclipse /JDK(OS为64位Windows 7). 1.禁用防病毒软件,或将JDK.Eclipse.workspac ...
- 闲谈--心态 (zhuan)
http://blog.csdn.net/marksinoberg/article/details/53261034 ***************************************** ...
- jQuery封装函数
//1,插件命名:jQuery.插件名.js 为拉避免和其他库的冲突// //2,自定义插件尽量避免使用$ 如果非要使用$就一定要将jQuery传递进去,//写在最后加一个小括号写jquery ;结束 ...