hdu 4337 King Arthur's Knights#DFS
来源:互联网 发布:濑户内海配乐知乎 编辑:程序博客网 时间:2024/04/28 15:44
/*n 个点的无向图上有m条边,求出一条包含这n个点的回路。n <= 150,竟然可以直接不加任何优化的DFS暴搜过去*/#include <stdio.h>#include <string.h>#include <algorithm>#include <vector>using namespace std;#define N 200vector<int> vec[N];int mat[N][N],ord[N],vis[N];int f = 0,n,m;void dfs(int rt,int t){ if(f) return ; ord[t] = rt; int i; if(t == n) { if(mat[rt][1]) { f = 1; for(i = 1; i < n; ++i) printf("%d ",ord[i]); printf("%d\n",ord[i]); } return; } int len = vec[rt].size(); for(i = 0; i < len; ++i) { if(vis[vec[rt][i]] == 0) { vis[vec[rt][i]] = 1; dfs(vec[rt][i],t+1); vis[vec[rt][i]] = 0; } }}int main(){ int i,j; while(scanf("%d%d",&n,&m) == 2) { memset(mat,0,sizeof(mat)); memset(ord,0,sizeof(ord)); memset(vis,0,sizeof(vis)); while(m--) { scanf("%d%d",&i,&j); mat[i][j] = mat[j][i] = 1; vec[i].push_back(j); vec[j].push_back(i); } f = 0; vis[1] = 1; dfs(1,1); for(i = 1; i <= n; ++i) vec[i].clear(); } return 0;}
/*n 个点的无向图上有m条边,求出一条包含这n个点的回路。n <= 150,竟然可以直接不加任何优化的DFS暴搜过去*//*再交一次贪心的搜索的,优先搜索有较少儿子结点的儿子。结果时间也没有优化*/#include <stdio.h>#include <string.h>#include <algorithm>#include <vector>using namespace std;#define N 200struct node{ int u,cnt; node(int a,int b) { u = a; cnt = b; }};vector<int> vec[N];vector<node> vv[N];int mat[N][N],ord[N],vis[N];int f = 0,n,m;bool cmp(node a,node b){ return a.cnt < b.cnt;}int dfs(int rt,int t){ ord[t] = rt; int i; if(t == n) { if(mat[rt][1]) { f = 1; for(i = 1; i < n; ++i) printf("%d ",ord[i]); printf("%d\n",ord[i]); return 1; } return 0; } int len = vv[rt].size(); for(i = 0; i < len; ++i) { if(vis[vv[rt][i].u] == 0) { vis[vv[rt][i].u] = 1; if(dfs(vv[rt][i].u,t+1)) return 1; vis[vv[rt][i].u] = 0; } } return 0;}int main(){ int i,j; while(scanf("%d%d",&n,&m) == 2) { memset(mat,0,sizeof(mat)); memset(ord,0,sizeof(ord)); memset(vis,0,sizeof(vis)); while(m--) { scanf("%d%d",&i,&j); mat[i][j] = mat[j][i] = 1; vec[i].push_back(j); vec[j].push_back(i); } for(i = 1; i <= n; ++i) { m = vec[i].size(); for(j = 0; j < m; ++j) vv[i].push_back(node(vec[i][j],vec[vec[i][j]].size())); sort(vv[i].begin(),vv[i].end(),cmp); } f = 0; vis[1] = 1; dfs(1,1); for(i = 1; i <= n; ++i) vec[i].clear(),vv[i].clear(); } return 0;}
附hdoj的人人上正解
中等题,构造一个特殊图的Hamilton回路。首先随机得到一个环序列a1, a2, ..., an, 如果a(i)->a(i+1)在图中没有边,因为每个点至少和一半的点有边相连,于是一定可以找到另一个点j,满足a(i)-a(j)有边,a(i+1)-a(j+1)有边。然后反转环中a(i+1)到a(j)这一段序列,即可令环上存在的边数增加1或2(取决于原来的环上a(j)->a(j+1)是否有边)。继续此过程直到环上所有的边都存在。
- hdu 4337 King Arthur's Knights#DFS
- HDU 4337 King Arthur's Knights(暴力dfs)
- hdu 4337 King Arthur's Knights(dfs)
- HDU 4337 King Arthur's Knights (图论+dfs) = =
- hdu 4337 King Arthur's Knights
- hdu4337 King Arthur's Knights(dfs回溯)
- hdu - 4337 - King Arthur's Knights - 哈密顿回路
- King Arthur's Knights hdu 4337 汉密尔顿图(模板)
- HDU 4337 King Arthur's Knights——回溯法
- HDU 4337 King Arthur's Knights 【哈密顿模板题】
- hdu4337 King Arthur's Knights
- hdu4337 King Arthur's Knights
- HDU 4337 King Arthur's Knights 稠密图构造汉密尔顿回路
- HDU 4337 King Arthur's Knights(…
- hdu 4337 King Arthur's Knights(哈密顿回路,4级)
- HDU 4337 King Arthur's Knights 输出一条哈密顿回路
- King Arthur's Knights —— 结题报告!
- HDU4337 King Arthur's Knights【哈密顿回路】
- ACE-ACE历史与简评
- 解开Android应用程序组件Activity的"singleTask"之谜
- java基本的程序设计结构
- 内部排序法小结
- 数据库表解锁
- hdu 4337 King Arthur's Knights#DFS
- 单文档中动态创建带有图标的工具栏
- Unix环境高级编程学习笔记(三) 文件与目录
- java 静态代理 动态代理 CGLib代理 浅析
- CSS3变换入门
- Oracle
- oracle的分页查询
- js 中 throttle 的实现
- hibernate配置文件hibernate.cfg.xml的详细解释