UVA10160在一个图中选择几个点,使得这些点加上相邻的点为这个图的顶点集
来源:互联网 发布:exchange2010多域名 编辑:程序博客网 时间:2024/04/29 11:07
很明显爆搜一发肯定T,肯定要加剪枝,关键就在于你怎么样去剪枝,另外本弱刚开始想写一个搜索,竟然笨到这种情况
不会还原vis标记数组,其实就是遇到加一,还原减一,而不是简单的等于0和等于1。然后讲一下剪枝,这里比较容易想到的一个
剪枝就是搜索到某个状态站点数已经大于当前的最小站点数了,就不用继续搜下去了,就return。然而这只是一个很小的剪枝,并没有
什么卵用,这里关键的剪枝在于:
位向量法枚举子集大家都知道,这里是类似的位向量dfs。当你搜索到每个点时,去判断这个点前面你没有当作站点的那个点,和那个点相连
点的最大的点是否小于你当前搜索到的点,如果小于,无论你后面怎么搜你都不可能搜索到满足条件的答案,剪掉。
应该很容易明白,如果不明白可以看代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <map>#include <set>#include<cmath>#include<climits>#include<cfloat>#include<cctype>#include<string>#include<queue>#define LL long longusing namespace std;const LL mod= 1e9 + 7;const LL N=40;int V,E;vector<int> a[N];int ans;int vis[N];void dfs(int p,int n,int s){ if(n==V&&s<ans) {ans=s;return;} if(p>V||s>=ans) return; for(int i=1;i<p;i++) if(!vis[i]&&a[i][a[i].size()-1]<p) return; int r=0; for(int i=0;i<a[p].size();i++) { int tem=a[p][i]; if(!vis[tem]) r++; vis[tem]++; } if(r) dfs(p+1,n+r,s+1); for(int i=0;i<a[p].size();i++) { int tem=a[p][i]; vis[tem]--; } dfs(p+1,n,s);}void solve(){ for(int i=1;i<=V;i++) { a[i].push_back(i); sort(a[i].begin(),a[i].end()); } ans=V; dfs(1,0,0); cout<<ans<<endl;}int main(){ while(cin>>V) { cin>>E; if(!V&&!E) break; for(int i=1;i<=V;i++) a[i].clear(); for(int i=0;i<E;i++) { int x,y; cin>>x>>y; a[x].push_back(y); a[y].push_back(x); } solve(); } return 0;}
0 0
- UVA10160在一个图中选择几个点,使得这些点加上相邻的点为这个图的顶点集
- 有向图中以一个顶点为起始点的所有路径
- hdoj 3844 Mining Your Own Business 【在无向图选择尽量少的点涂黑,使得任意删除一个点后每个BCC里面至少有一个点涂黑】
- 给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~
- PCL框选顶点(要删除这些点)并在另一个窗口显示剩余的点
- 两个点已知一个点的方向,判断另一个点在这个的方位(左前/右后)
- AE开发,有几个点,已知X,Y坐标,如何在AxMapControl中显示这些点
- 在平面中,一个点绕任意点旋转θ度后的点的坐标
- 在平面中,一个点绕任意点旋转θ度后的点的坐标
- 折线图中,时间单位是天时,同一天的两条数据,在时间轴上展现为两个点,而不是一个点
- 如何判断一个点是否在一个闭合区域内(无凹进的顶点)
- _DataStructure_C_Impl:求图G中从顶点u到顶点v的一条简单路径
- 交换单链表中相邻的两个点(人搜)
- Hdu4195给你三个顶点,这三个点是一个正多边形上的顶点,问这个正多边形最少有多少个边
- hunnu10701(在n个点中选三个点,使得构成的面积最大)
- 以图片左上顶点为远点,剪成一张width和height的图片(仅限JPG的图)
- js中计算一个时间点加上一个时间段后的时间
- NIO中几个非常重要的技术点
- CGI——C程序设计
- Linux内核模块指南(第十一章===>附录)。。。翻译完。。。
- 关于ListView数据错乱的解决方案
- Git使用
- bitand( ) 函数用法
- UVA10160在一个图中选择几个点,使得这些点加上相邻的点为这个图的顶点集
- uboot分区和内核MTD分区
- C# 日志
- ocp-221
- 机票预定系统可行性分析
- ocp-222
- STL的应用
- ocp-223
- ocp-224