一开始写的代码加上各种剪枝后还是超时, 然后看了一下状态压缩后过了,两个代码的具体思想是一样的,状态压缩后可以大大提升性能

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>
#define maxn 200010
#define INF 0x7fffffff
#define inf 10000000
#define ull unsigned long long
#define ll long long
using namespace std; ll st[40], vis[40];
int n, m; bool dfs(ll state, int ans, int aim, int k)
{
if(ans == aim)
{
if(state == ((ll)1 << n)-1) return true;
return false;
}
for(int i = k; i <= n; ++ i)
{
if((state|vis[i]) != ((ll)1 << n)-1) return false;
if((state|st[i]) == state) continue;
if(dfs(state|st[i], ans+1, aim, i+1)) return true;
}
return false;
}
void init()
{
memset(vis, 0, sizeof(vis));
for(int i = 0; i < n; ++ i)
st[i+1] = ((ll)1 << i);
}
int main()
{
while(scanf("%d%d", &n, &m) == 2 && n+m)
{
init();
for(int i = 0; i < m ; ++ i)
{
int a, b;
scanf("%d%d", &a, &b);
st[a] |= ((ll)1 << (b-1));
st[b] |= ((ll)1 << (a-1));
}
vis[n] = st[n];
for(int i = n-1; i > 0; -- i)
vis[i] = vis[i+1]|st[i];
for(int i = 1; i <= n; ++i)
{
if(dfs((ll)0, 0, i, 1))
{
printf("%d\n", i);
break;
}
}
// puts("*****************");
}
return 0;
}

\*time limit*\
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>
#define maxn 200010
#define INF 0x7fffffff
#define inf 10000000
#define ull unsigned long long
#define ll long long
using namespace std; vector<int> g[40];
int vis[40];
bool mm[40][40];
int n, m;
bool checkall()
{
for(int i = 1; i <= n; ++ i)
if(!vis[i]) return false;
return true;
}
bool checkii(int now)
{
for(int i = now+1; i <= n; ++ i)
if(mm[i][now]) return false;
return true;
}
bool checknow(int now)
{
if(!vis[now]) return true;
for(int i = 0; i < (int)g[now].size(); ++ i)
if(!vis[g[now][i]]) return true;
return false;
}
void ok(int now)
{
vis[now]++;
for(int i = 0; i < (int)g[now].size(); ++ i)
vis[g[now][i]]++;
}
void Nok(int now)
{
vis[now]--;
for(int i = 0; i < (int)g[now].size(); ++ i)
vis[g[now][i]]--;
}
bool dfs(int ans, int aim, int k)
{
if(ans == aim)
{
if(checkall()) return true;
return false;
}
for(int i = k; i <= n; ++ i)
{
if(checknow(i))
{
ok(i);
if(dfs(ans+1, aim, i+1)) return true;
Nok(i);
}
if(!vis[i] && checkii(i)) return false;
}
return false;
}
void init()
{
memset(vis, 0, sizeof(vis));
memset(mm, 0, sizeof(mm));
for(int i = 1; i <= n; ++ i) g[i].clear();
}
int main()
{
while(scanf("%d%d", &n, &m) == 2 && n+m)
{
init();
for(int i = 0; i < m ; ++ i)
{
int a, b;
scanf("%d%d", &a, &b);
g[a].push_back(b);
g[b].push_back(a);
mm[a][b] = mm[b][a] = true;
}
for(int i = 1; i <= n; ++i)
{
if(dfs(0, i, 1))
{
printf("%d\n", i);
break;
}
}
}
return 0;
}

uva 10160的更多相关文章

  1. UVA 10160 Servicing Stations(深搜 + 剪枝)

    Problem D: Servicing stations A company offers personal computers for sale in N towns (3 <= N < ...

  2. uva 10160 Servicing Stations(DFS+剪枝)

    Servicing stations A company offers personal computers for sale in N towns (3 <= N <= 35). The ...

  3. UVA 10160 Servicing Stations(状态压缩+迭代加深)

    [题目链接] LInk [题目大意] 给出一些点和边,选择一个点就能把这个点和相邻的点都覆盖,求最小点覆盖 [题解] 我们压缩点被覆盖的状态,迭代加深搜索覆盖的最小点数, 当剩余的点全部选上时都无法完 ...

  4. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  5. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  6. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  7. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

  8. UVA计数方法练习[3]

    UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...

  9. UVA数学入门训练Round1[6]

    UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include &l ...

随机推荐

  1. 20141124-JS 变量,数据类型

    变量: 变量是JS中存储信息的容器,必须以字母开头. 格式: 定义变量只能用 var 定义,用 = 赋值. <script> var x=2; </script> 字符串型的值 ...

  2. bzoj 1006: [HNOI2008]神奇的国度

    这是个标准的弦图,但如果不知道弦图就惨了=_= 趁着这个机会了解了一下弦图,主要就是完美消除序列,求出了这个就可以根据序列进行贪心染色. 貌似这个序列很神,但是具体应用不了解…… 这道题为什么可以这么 ...

  3. some windowsphone templates

    http://inspirationfeed.com/freebies/20-free-windows-phone-7-mockup-and-wireframing-resources/

  4. bootstrap2.3.2 modal 用href时有缓存

    $('body').on('hidden', '.modal', function () {$(this).removeData('modal');}); 直接在js里加入上面的代码就可以解决缓存问题 ...

  5. 在 linux x86-32 模式下分析内存映射流程

    前言 虚拟内存机制已经成为了现代操作系统所不可缺少的一部分, 不仅可以为每个程序提供独立的地址空间保证安全性,更可以通过和磁盘的内存交换来提高内存的使用效率.虚拟内存管理作为linux 上的重要组成部 ...

  6. IntelliJ IDEA+Tomcat+Nginx运行git项目

    1.克隆Git项目到本地 (1)设置Git工具路径:file>settings>Version Control>Git (2)设置GitHub账户:file>settings& ...

  7. 锋利的jquery-DOM操作

    1 查找节点 ① 可根据jquery选择器来完成节点查找 ② 可用.text()获取节点的文本内容 ③ 可用.attr("attr")获取属性value 2 创建节点 ① 可用jq ...

  8. 【Qt】Qt之重启应用程序【转】

    简介 今天分享的内容有些意思-如何重启一个应用程序.其实,有时候这是一个很重要的功能点,而且很人性化.易用性很好. 例如:切换用户.当某个用户登录成功之后,需要切换到其它账号,那么这时,你就知道它的重 ...

  9. (原创)LINUX_UNIX设计思想-读书笔记

    第一章 一.Unit哲学 1.小即是美 2.让每一个程序只做好一件事情 3.尽快建立原型 4.舍高效率而取可移植性 5.使用纯文本文件来存储数据 6.充分利用软件的杠杆效应 7.使用shell脚本来提 ...

  10. 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)

    AsyncTask使用方法详情:http://www.cnblogs.com/zzw1994/p/4959949.html 下拉开源框架PullToRefresh使用方法和下载详情:http://ww ...