uva 10160
一开始写的代码加上各种剪枝后还是超时, 然后看了一下状态压缩后过了,两个代码的具体思想是一样的,状态压缩后可以大大提升性能
#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的更多相关文章
- UVA 10160 Servicing Stations(深搜 + 剪枝)
Problem D: Servicing stations A company offers personal computers for sale in N towns (3 <= N < ...
- uva 10160 Servicing Stations(DFS+剪枝)
Servicing stations A company offers personal computers for sale in N towns (3 <= N <= 35). The ...
- UVA 10160 Servicing Stations(状态压缩+迭代加深)
[题目链接] LInk [题目大意] 给出一些点和边,选择一个点就能把这个点和相邻的点都覆盖,求最小点覆盖 [题解] 我们压缩点被覆盖的状态,迭代加深搜索覆盖的最小点数, 当剩余的点全部选上时都无法完 ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
- UVA计数方法练习[3]
UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...
- 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 ...
随机推荐
- javascript之面向对象程序设计(对象和继承)
总结的文章略长,慎点. 知识点预热 引用类型:引用类型的值(对象)是引用类型的一个实例.在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起.在其他面向对象语言中被称为类,虽然 ...
- [javascript|基本概念|一元操作符]学习笔记
只操作一个值的操作符 递增/递减操作符 前置型/后置型 前置型:操作符位于操作数前面 e.g.: var a = 30; ++a; 等同于 var a = 30; a = a + 1; --> ...
- ionic中的生命周期函数
//ionic中的生命周期函数 onPageLoaded(){ //page初始化时 console.log("page 1 : page loaded"); } //在这里可以做 ...
- Android四大组件之一:BroadCastReceiver(广播接收者)
广播接受者是(BroadCastReceiver)是Android中的地大组件之一,之前学习了一些关于BroadCastReceiver方面的知识,今天回过头来发现已经快忘记的差不多了,毕竟现在是刚开 ...
- 使用CInternetSession CHttpFile下载网页链接地址的文件
思路很清晰,使用CInternetSession创建CHttpFile对象.然后对该对象获取文件信息.进行文件读写操作均可. void DownloadFile(LPCTSTR szURL, LPCT ...
- java集合学习一
首先看一下java集合的关系图 1.1从全面了解Java的集合关系图.常见集合 list set map等其中我们最常用的 list map 结合.几天说一下常见的map.map在我工作的两年里 ...
- Windows Server 2008 R2(x64) IIS7+PHP5(FastCGI)环境搭建
相关软件下载: 1.PHP下载地址: http://windows.php.net/downloads/releases/php-5.4.4-nts-Win32-VC9-x86.zip 如果是win2 ...
- hadoop数据流转过程分析
hadoop:数据流转图(基于hadoop 0.18.3):通过一个最简单的例子来说明hadoop中的数据流转. hadoop:数据流转图(基于hadoop 0.18.3): 这里使用一个例子说明ha ...
- 画了一张PHPCMSV9的运行流程思维导图
转载:http://www.cnblogs.com/fuyunbiyi/archive/2012/03/12/2391253.html
- Messages.pas里的消息
一.Windows 消息大全 这张表拷贝自万一兄的帖子:http://www.cnblogs.com/del/archive/2008/02/25/1079970.html 但是我希望自己能把这些消息 ...