博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2181 哈密顿绕行世界问题 dfs 难度:1
阅读量:5031 次
发布时间:2019-06-12

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

http://acm.hdu.edu.cn/showproblem.php?pid=2181

只有20个城市,而且每个点的度数恰好是3,也就意味着,对于即将进入环中的点,入度1,出度2,下一个点只有两种可能

暴力枚举出所有的路径,也不过3*2^18,之后对于每个点作为起点的情况分别调整即可

#include 
#include
#include
using namespace std;int e[21][3];bool vis[21];struct circle{ int a[20]; circle(){} circle(int b[20]){ for(int i=0;i<20;i++)a[i]=b[i]; } bool operator <(circle c2)const {//便于按字典序排序 for(int i=0;i<20;i++){ if(a[i]
c2.a[i])return false; } return false; } void rot(int m){//调整成以m为起点 int ind=0; for(;ind<20&&a[ind]!=m;ind++){} int b[20]; for(int i=0;i<20;i++){ b[i]=a[(i+ind)%20]; } for(int i=0;i<20;i++){ a[i]=b[i]; } }}c[100000];int cnum;int heap[20];void dfs(int s,int f,int cnt){ vis[s]=true; heap[cnt-1]=s; if(cnt==20){ for(int i=0;i<3;i++){ if(e[s][i]==f){ c[cnum++]=circle(heap); } } vis[s]=false; return ; } for(int i=0;i<3;i++){ if(!vis[e[s][i]]){ dfs(e[s][i],f,cnt+1); } } vis[s]=false;}int main(){ int m; for(int i=1;i<=20;i++){ for(int j=0;j<3;j++){ scanf("%d",e[i]+j); } } dfs(1,1,1); while(scanf("%d",&m)==1&&m!=0){ for(int i=0;i

 

转载于:https://www.cnblogs.com/xuesu/p/4372085.html

你可能感兴趣的文章
为什么JS动态生成的input标签在后台有时候没法获取到
查看>>
20189210 移动开发平台第六周作业
查看>>
java之hibernate之基于外键的双向一对一关联映射
查看>>
rxjs一句话描述一个操作符(1)
查看>>
第一次独立上手多线程高并发的项目的心路历程
查看>>
ServiceStack 介绍
查看>>
Centos7下载和安装教程
查看>>
无谓的通宵加班之后的思索
查看>>
S1的小成果:MyKTV系统
查看>>
从setting文件导包
查看>>
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>
union和union all
查看>>
Github 开源:使用控制器操作 WinForm/WPF 控件( Sheng.Winform.Controls.Controller)
查看>>
PMD使用提醒
查看>>
Codeforces 887D Ratings and Reality Shows
查看>>
论文《A Generative Entity-Mention Model for Linking Entities with Knowledge Base》
查看>>
Linux记录-salt分析
查看>>
Android Studio默认快捷键
查看>>
发布开源库到JCenter所遇到的一些问题记录
查看>>
第七周作业
查看>>