博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 10160
阅读量:4959 次
发布时间:2019-06-12

本文共 2790 字,大约阅读时间需要 9 分钟。

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

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define maxn 200010#define INF 0x7fffffff#define inf 10000000#define ull unsigned long long#define ll long longusing 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 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define maxn 200010#define INF 0x7fffffff#define inf 10000000#define ull unsigned long long#define ll long longusing namespace std;vector
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;}

转载于:https://www.cnblogs.com/avema/p/3774266.html

你可能感兴趣的文章
求一个字符串中最长回文子串的长度(承接上一个题目)
查看>>
简单权限管理系统原理浅析
查看>>
springIOC第一个课堂案例的实现
查看>>
求输入成绩的平均分
查看>>
php PDO (转载)
查看>>
wordpress自动截取文章摘要代码
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
scanf和gets
查看>>
highcharts 图表实例
查看>>
ubuntu下如何查看用户登录及系统授权相关信息
查看>>
秋季学期学习总结
查看>>
SpringBoot 优化内嵌的Tomcat
查看>>
【LaTeX】E喵的LaTeX新手入门教程(1)准备篇
查看>>
highcharts曲线图
查看>>
extjs动态改变样式
查看>>
PL/SQL Developer 查询的数据有乱码或者where 字段名=字段值 查不出来数据
查看>>
宏定义
查看>>
ubuntu12.04 串口登录系统配置
查看>>
poj3061
查看>>
linux--多进程进行文件拷贝
查看>>