HDU5952 dfs+剪枝
题目分析:
对于给出的n个点和m条边,求这个图的完全联通子图的数量(每次查询的子图的大小为s),对于本题而言,很容易想到的是dfs暴力和这个点相连的所有的点,并且判断这个图是否是度为s 的完全联通子图,但是如果不作任何处理的话会超时,这里需要合理选择剪枝,排除不可能的查询
注意点:
1.用in[i]数组表示编号为i的点的度,对于每次判断,如果这个点的度小于s-1这个点就直接放弃
2.对于边之间的关系,u and v (1 ≤ u < v ≤ N),所以对于每次查询,我们从小往大的编号查询即可,这样将无向图转化为有向图减少了查询的次数
3.对于每个编号的有连线的点通过vector存储,这样查询的时候直接查询和这个被选中的点相连的点是否能加入完全联通子图即可
代码:
#include<iostream>
#include<vector>
#include<string.h>
using namespace std; int mat[][];
int set[];
int in[];
vector<int>edge[];
int ans, s, n, m; void dfs(int last, int num){
if(in[last] < s-) return;
if(num == s){
ans++;
return;
}
for(int i = ; i < edge[last].size(); i++){
int x = edge[last][i];
if(in[x] < s-) continue;
int j;
for(j = ; j <= num; j++){
int from = set[j];
int to = x;
if(mat[from][to] == ) break;
}
if(j > num){
set[num+] = x;
dfs(x, num+);
}
}
} int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d%d%d", &n, &m, &s);
for(int i = ; i <= n; i++) edge[i].clear();
memset(mat, , sizeof(mat));
memset(in, , sizeof(in));
for(int i = ; i <= m; i++){
int x, y;
scanf("%d%d", &x, &y);
edge[x].push_back(y);
mat[x][y] = ;
mat[y][x] = ;
in[x]++; //保存每个点的入度 用于剪枝
in[y]++;
}
ans = ;
for(int i = ; i <= n; i++){
set[] = i; //set中第一个元素定下
dfs(i, ); //set中已经有的最后一个编号 已经在set中的编号数
}
printf("%d\n", ans);
}
return ;
}
HDU5952 dfs+剪枝的更多相关文章
- *HDU1455 DFS剪枝
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- POJ 3009 DFS+剪枝
POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...
- poj 1724:ROADS(DFS + 剪枝)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10777 Accepted: 3961 Descriptio ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- DFS+剪枝 HDOJ 5323 Solve this interesting problem
题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))
Equation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- LA 6476 Outpost Navigation (DFS+剪枝)
题目链接 Solution DFS+剪枝 对于一个走过点k,如果有必要再走一次,那么一定是走过k后在k点的最大弹药数增加了.否则一定没有必要再走. 记录经过每个点的最大弹药数,对dfs进行剪枝. #i ...
- poj 1011 Sticks (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ...
随机推荐
- [LeetCode] 146. LRU Cache 最近最少使用页面置换缓存器
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
- [LeetCode] 74. Search a 2D Matrix 搜索一个二维矩阵
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- 修改Windows中文用户名为英文(更全面的方法)
网上方法很多,但是大多不全面. 我的建议是 1,新建/切换管理员账号 net user administrator /active:yes 然后点击桌面,使用Alt+F4组合键 注销中文用户名账号,并 ...
- Debian/Ubuntu下安装Apache的Mod_Rewrite模块的步骤
启用 Mod_rewrite 模块:sudo a2enmod rewrite 另外,也可以通过将 /etc/apache2/mods-available/rewrite.load 连接到 /etc/a ...
- Shell脚本——显示系统上的登录用户数
写一个脚本showlogged.sh,其用法格式为: showlogged.sh -v -c -h|--help 其中,-h选项只能单独使用,用于显示帮助信息:-c选项时,显示当前系统上登录的所有用户 ...
- SWIG 3 中文手册——5. SWIG 基础知识
目录 5 SWIG 基础知识 5.1 运行 SWIG 5.1.1 输入格式 5.1.2 SWIG 输出 5.1.3 注释 5.1.4 C 预处理器 5.1.5 SWIG 指令 5.1.6 解析限制 5 ...
- SpringCloud与Dubbo区别对比
1:SpringCloud与Dubbo区别对比 (1):活跃度 目前SpringCloud的活跃度明显远高于Dubbo(参考github) (2):主要区别 Dubbo Spring Cloud ...
- javascript 对象,函数,原型和 this
1.对象 在javascript里,一切都是对象,包括函数自身(不是指具体的函数,而是指"Function"这个东东).例如: var fun1=new Function(&quo ...
- java 获取真实ip地址
/** * 获取真实ip地址 * @param request * @return */ public static String getIpAddress(HttpServletRequest re ...
- JSON文件加注释的7种方法
JSON文件加注释的7种方法 缺省不能加注释,现实有需求 根据JSON规范(http://www.json.org, RFC 4627, RFC 7159),不支持注释.JSON规范之所以不允许加注释 ...