原题地址

回溯搜索

对于每个待枚举的点,检查:

1. 度数检查:是否违反了出度入度限制。因为生成的路径除了首尾节点外,其他节点的出度和入度只能为2

2. 共线检查:是否违反了共线条件。即跨越了尚未枚举过的节点

对于枚举产生的路径,检查:

1. 长度检查:长度是否大于等于4

2. 完整性检查:是否包含了片段中出现的所有边

代码:

 #include <iostream>
#include <cstring> using namespace std; int impossible[]; bool integrity_check(int piece[][], int path[][]) {
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
if (piece[i][j] && !path[i][j])
return false;
return true;
} bool degree_check(int piece[][], int path[][], int b, int e) {
if (piece[b][e])
return true; int bdegree = ;
int edegree = ; for (int i = ; i < ; i++) {
bdegree += path[b][i] || piece[b][i] ? : ;
edegree += path[e][i] || piece[e][i] ? : ;
} return bdegree < && edegree < ;
} bool collineation_check(int visited[], int b, int e) {
int t = (b + ) * + e + ;
return impossible[t] < || visited[impossible[t] - ];
} bool check(int piece[][], int path[][], int visited[], int b, int e) {
if (visited[e])
return false; return degree_check(piece, path, b, e) && collineation_check(visited, b, e);
} int search(int piece[][], int path[][], int visited[], int p, int len) {
int res = ; if (len >= && integrity_check(piece, path))
res++; for (int i = ; i < && len < ; i++) {
if (check(piece, path, visited, p, i)) {
visited[i] = ;
path[p][i] = path[i][p] = ;
res += search(piece, path, visited, i, len + );
path[p][i] = path[i][p] = ;
visited[i] = ;
}
} return res;
} int main() {
int T;
memset(impossible, -, sizeof(int) * );
impossible[] = ;
impossible[] = ;
impossible[] = ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ;
impossible[]= ; cin >> T;
while (T--) {
int N;
int piece[][] = {{, }};
int path[][] = {{, }};
int visited[] = {};
int res = ; cin >> N;
for (int i = ; i < N; i++) {
int a, b;
cin >> a >> b;
piece[a - ][b - ] = piece[b - ][a - ] = ;
} for (int i = ; i < ; i++) {
visited[i] = ;
res += search(piece, path, visited, i, );
visited[i] = ;
} cout << res << endl;
}
return ;
}

最新文章

  1. 分别用ToolBar和自定义导航栏实现沉浸式状态栏
  2. python二进制相关
  3. REST vs SOAP
  4. Linear regression with multiple variables(多特征的线型回归)算法实例_梯度下降解法(Gradient DesentMulti)以及正规方程解法(Normal Equation)
  5. python 注意事项
  6. 20160725noip模拟赛&ldquo;Paodekuai&rdquo; alexandrali
  7. HDU3371--Connect the Cities(最小生成树)
  8. cdn是什么
  9. 做一个常规的banner图——负边距的使用、banner图的拼法
  10. php(三)使用thinkphp操作数据库
  11. 创建数组必须指定数组数目之new运算符避免这种限制
  12. 【转载】wifi的两种工作模式
  13. Day013--Python--内置函数一
  14. Hadoop ha CDH5.15.1-hadoop集群启动后,集群容量不正确,莫慌,这是正常的表现!
  15. Gitblit 的安装使用
  16. How to transfer developer profile to one mac to another mac
  17. 【Android】详解Android动画
  18. centos-linux热拔插scsi硬盘
  19. jQuery基础(工具函数,浏览器信息,检测节点,字符串,$.extend())
  20. 【TP3.2】 动态切换数据库方法

热门文章

  1. 选择排序 分类: 算法 c/c++ 2014-10-10 20:32 509人阅读 评论(0) 收藏
  2. 在Eclipse+ADT中开发Android系统的内置应用
  3. 2016/10/29 Action类中execute方法的使用
  4. DotNteBar 控件操作
  5. 434 Number of Segments in a String 字符串中的单词数
  6. 转】R利剑NoSQL系列文章 之 Hive
  7. Laravel环境搭建
  8. windwsform登录页面
  9. HTML5 File API的应用
  10. Android(java)学习笔记191:ContentProvider使用之利用ContentProvider备份和还原手机短信(掌握)