蓝桥杯 哈密尔顿回路 Java
问题描述
给出一个有向图,输出这个图的一个哈密尔顿回路。
输入格式
输入的第一行包含两个整数n, m,分别表示图的点数和边数。
接下来m行,每行包含两个整数,表示一条边的起点和终点。
输出格式
输出一行,包含一个n个整数,表示一条哈密尔顿回路。如果没有回路输出“No Answer””。
数据规模和约定
1<=n<=20,图中没有重边。
哈密尔顿回路
若图G中一个回路通过且仅通过每一个顶点一次,称这个环为哈密顿回路。
bfs,耗时太久没有通过全部样例,得分 84
package ADV;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;public class ADV319 {static String[] s;static int[] ans = new int[20];static int n,m;static int[] vis;static HashMap<Integer,ArrayList<Integer>> map = new HashMap<>();public static void main(String[] args) throws IOException {BufferedReader in = new BufferedReader(new InputStreamReader(System.in));s = in.readLine().split(" ");n = Integer.valueOf(s[0]);m = Integer.valueOf(s[1]);vis = new int[n+1];for (int i = 0; i < m; i++) {int from,to;s = in.readLine().split(" ");from = Integer.valueOf(s[0]);to = Integer.valueOf(s[1]);if(map.containsKey(from)) {map.get(from).add(to);}else {ArrayList<Integer> L = new ArrayList<Integer>();L.add(to);map.put(from, L);}}if(bfs(1,0,ans)) {//因为是回路,所以从哪个点找都可以for (int i = 0; i < n; i++) {if(i==0) {System.out.print(ans[i]);}else {System.out.print(" "+ans[i]);}}}else {System.out.print("No Answer");}}/*** * @param start 当前从哪个点开始(未进入ans)* @param lv 下一个点应存放的位置* @param ans 保存路径* @return*/static boolean bfs(int start,int lv,int[] ans) {ArrayList<Integer> edges = map.get(start);ans[lv] = start;lv++;vis[start] = 1;if(lv == n) {//找到了哈密尔顿路径,判断是否是回路boolean isLoop = false;for (Integer to : edges) {if(to == 1) {isLoop = true;break;}}if(isLoop) {return true;}else {return false;}}if(edges == null) {//没找到哈密尔顿路径,又不能进入下一点return false;}boolean flag = false;for (Integer to : edges) {//进入下一点if(vis[to]==0) {flag = bfs(to,lv,ans);vis[to]=0;if(flag) {//找到了哈密尔顿回路,立刻返回return flag;}}}return flag;}
}
蓝桥杯 哈密尔顿回路 Java相关推荐
- java哈密尔顿回路算法,用回溯方法求哈密尔顿回路——java求解
// 哈密尔顿回路问题 public class Hamilton { // 图中顶点个数为n,图的邻接矩阵为c[][],存放回路的顶点序号x[],在这里,n个顶点的标号是:0,1,2,...,n-1 ...
- 什么是哈密尔顿回路/路径?
一:哈密尔顿回路与哈密尔顿路径 1859 年,爱尔兰数学家哈密尔顿(Hamilton)提出了一个"周游世界"的游戏: 在一个正十二面体的二十个顶点上,标注了伦敦,巴黎,莫斯科等世界 ...
- 欧拉回路和哈密尔顿回路
"哈密尔顿回路问题"与"欧拉回路问题"看上去十分相似,然而却是完全不同的两个问题."哈密尔顿回路问题"是访问除原出发结点以外的每个结点一次且 ...
- 2022年第十三届蓝桥杯大赛软件省赛Java学B组试题
第十三届蓝桥杯大赛软件省赛Java学B组试题 一.试题截图 1. 星期计算 这道题是可以直接用笔算起来的,我算出来的答案是5,(2022整除7 余6,六天后就是星期五)但目前官方答案还不知道是什么? ...
- 第十三届蓝桥杯模拟赛第二期JAVA组个人题解
第十三届蓝桥杯模拟赛第二期JAVA组个人题解 文章目录 第十三届蓝桥杯模拟赛第二期JAVA组个人题解 题目1 题目2 题目3 题目4 题目5 题目6 题目7 题目8 题目9 题目10 题目1 小蓝的I ...
- 蓝桥杯练习系统之基础训练Java版(2-26)—— 报时助手
蓝桥杯练习系统之基础训练Java版(2-26)-- 报时助手 **难度等级:普通****关键字:字符串 条件判断** 问题描述: 给定当前的时间,请用英文的读法将它读出来.时间用时h和分m表示,在英文 ...
- 蓝桥杯练习系统-入门训练java版
蓝桥杯练习系统-入门训练:http://lx.lanqiao.cn/problemset.page?code=BEGIN-&userid=301077 package 蓝桥杯系统入门训练;im ...
- 第十三届蓝桥杯大赛软件类决赛Java大学B组C题——左移右移
[问题描述] 小蓝有一个长度为 N 的数组,初始时从左到右依次是 1, 2, 3, . . . N. 之后小蓝对这个数组进行了 M 次操作,每次操作可能是以下 2 种之一: 左移 x,即把 x 移动到 ...
- 第六届蓝桥杯大赛个人赛省赛Java B组真题
文章目录 第六届蓝桥杯大赛个人赛省赛Java B组真题 1. 三角形面积(结果填空) 2. 立方自变身(结果填空) 3. 三羊献瑞(结果填空) 4. 循环节长度(代码填空) 5. 九数组分数(代码填空 ...
最新文章
- ELK日志分析平台搭建全过程
- 几何分布的期望和方差
- systemctl和service
- C基础--字符串操作函数(strlen,strcpy,strcmp,strcat,strstr,strtok,strchr)
- 安全服务如何为SD-WAN增值?—Vecloud
- MyBatisPlus中通用CRUD的updateById方法
- Qt工作笔记-使用Qt中QProcess与iostream中system调用外部进程
- centos7忘记root密码,重置
- 【U盘量产工具】windows无法完成格式化——芯邦主控CBM2098S
- python单向认证_使用Python进行单向方差分析的四种方法
- 基于聚集诱导荧光探针细胞膜/细胞膜表面GABA受体荧光探针/上汞离子荧光探针的研究
- Uber数据泄露事件本可以使用区块链…
- 双软认证企业税收优惠政策
- j3455linux网卡不亮,最新J3455主板直接安装黑群晖的若干问题解决办法
- Maximum Likelihood (MLE) Maximum a posteriori (MAP)的分別
- 搜索专题——迷宫寻宝
- 单片机-6位数码管动态时间扫描程序,具有时分秒
- RHCE培训课程报道处
- 专利申请号有误请核实请输入9到13位数字
- android视频开发倍速播放,调整视频播放速度
热门文章
- python之items()的用法
- 北京外雇大学计算机系,北京大学计算机系 代亚非
- mysql数据库source命令导入sql文件
- HTML input 默认值设置
- linux pstree命令
- 安全网站相关,漏洞修复
- tried to access field com.mysql.cj.CharsetMapping.COLLATION_INDEX_TO_COLLATION_NAME from class io.de
- Soft Actor-Critic(SAC算法)
- 国内备案有什么好处?为什么国外服务器不用备案?
- (HihoCoder - 1049)后序遍历