哈密顿路

 1 var
 2   n,m,i,j,k1,k2:longint;
 3   a:array[1..20,1..20] of longint;
 4   b:array[1..20] of longint;
 5   visited:array[1..20] of boolean;
 6   flag:boolean;
 7 procedure print(k:longint);
 8 var i:longint;
 9 begin
10   if k=0 then writeln(‘no round‘)
11   else
12    begin
13      for i:=1 to n-1 do write(b[i],‘ ‘);
14      writeln(b[n]);
15    end;
16 //  halt;
17 end;
18 procedure dfs(i,k:longint);
19 var j:longint;
20 begin
21   if k=n then begin print(1); flag:=true; end;
22   for j:=1 to n do
23    if (a[j,i]=1) and (visited[j]=false) then
24     begin
25       visited[j]:=true;
26       b[k+1]:=j;
27       dfs(j,k+1);
28       visited[j]:=false;
29     end;
30 end;
31 begin
32   readln(n,m);
33   fillchar(a,sizeof(a),0);
34   for i:=1 to m do
35    begin
36      readln(k1,k2);
37      a[k1,k2]:=1;
38      a[k2,k1]:=1;
39    end;
40    for i:=1 to n do
41     begin
42       fillchar(visited,sizeof(visited),false);
43       b[1]:=i;
44       visited[i]:=true;
45       dfs(i,1);
46     end;
47   if not(flag) then print(0);
48 end.
时间: 2024-10-28 10:49:46

哈密顿路的相关文章

poj 1776 Task Sequences(哈密顿路)

题意:给定一个邻接矩阵,即一幅有向图(有环),问最少的覆盖路径为几条,求出遍历顺序: 思路:竞赛图存在哈密顿路,一定能找到一条遍历所有点的路. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int mm[1005][1005]; char ch[1005]; int nxt[50010]; int n,m; int main() { int i,j,k,head,t

哈密顿回路算法详解

[转]哈密顿回路 原文链接:http://www.cnblogs.com/Ash-ly/p/5452580.html 概念: 哈密顿图:图G的一个回路,若它通过图的每一个节点一次,且仅一次,就是哈密顿回路.存在哈密顿回路的图就是哈密顿图.哈密顿图就是从一点出发,经过所有的必须且只能一次,最终回到起点的路径.图中有的边可以不经过,但是不会有边被经过两次. 与欧拉图的区别:欧拉图讨论的实际上是图上关于边的可行便利问题,而哈密顿图的要求与点有关. 判定: 一:Dirac定理(充分条件) 设一个无向图中

BestCoder Round #53(hdu 5422&amp;5423&amp;5424)

hdu 5422: 题意:给出一个n个顶点,m条变的无向图,现在让你添加一条边,使1到n的最短路最短,并且在最短的情况下写出可以添加的边的不同数目. 思路:很简单,两种情况:1.如果1到n之间原来不存在边,那么我们添加的这一条边肯定是1~n,所以最短路一定是1,方法只有一种:2.如果1和n之间原来存在边,那么我们就随意连两个顶点即可,方法是n*(n-1)/2. #include <iostream> #include <string> #include <cstring>

【题解】 第五届在线编程大赛月赛第二题:走格子

题目详情 我们有一个两行n列格子的棋盘,你可以从任何位置出发.每次你可以沿着上下左右以及对角线的方向走一格(不能出去),求有多少条可能的哈密尔顿路?(即所有的格子只经过一次的路.) 例如: a b c d e f 一条可能的路径是b,f,c,e,d,a 输入格式: 多组数据,每组数据1行,包含一个正整数n表示列数. (n <= 1000) 输出格式: 每组数据输出一行包含一个整数,可能的路径条数.结果比较大,输出对10^9 + 7的结果 答题说明 输入样例 1 2 3 输出样例: 2 24 96

apio2017游记

//第一次写游记,只是流水账...结果好像确实只去游了…… day-11 省选挂了,即将退役……(然而apio之后得知并没有退役,感谢放我一条活路)(吐槽出题人考完才造数据,题目没有子任务之类的玩意,O(Tn^2)暴力ac了T<=100,n<=10000,这符合基本法吗)day-3-day-1 感觉期中考完挂day0 8:30的东航航班,因为"一带一路"会议,要提前三小时到机场,凌晨三点半起床,这时机场大巴都还没有的,幸好领队老师和coder107同乘一辆车,前一天说好捎了

找到图中最小有向圈的一个时间复杂度为O(mn)的算法

本文介绍一种在n个点 m条边并且没有负长度有向圈的有向图中找到最小有向圈的一个O(mn)时间复杂度的算法,这一结果是对于之前的最好的时间界O(mn+n^2 loglogn)的一个改进. 此算法首先在O(mn)时间复杂度内找到了具有最小平均长度λ^*的圈,因此它选择了点势函数来使得节约成本是λ^*或者更大.之后,该算法解决了所有点对之间的最短路问题,但是接下来将注意力集中于长度最多为nλ^*的最短路,将每一个源点的最短路时间的计算加速到O(m),这样所有的点时间的计算就到了O(mn). 同时,本文

BestCoder Round #53 (div.1)

Problem A: 题目大意: 给出以节点1为根的一棵树A,判断它是否是特殊的.一棵树是特殊的当且仅当不存在和它不完全相同的一棵树B,使得A中点i到点1的距离和B中相等. 题解: 假设一个点x的深度是d,它的父亲是y,如果存在一个深度为d-1的点z,那么把x从y下面移到z下面就可以得到树B了.所以求出每个深度的点的个数,只有当所有深度的点的个数都为1,最大深度的点的个数任意的时候 树是特殊的. Problem B: 题目大意: 给出N个点N条边的无向图判断是否存在哈密顿路. N<=1000.

常见算法问题的分类

一.递归算法 递归算法:是一个直接或间接调用自身的过程,但每次调用问题的规模都会减少,最终得以问题解决的过程. 递归算法的思想来源于分治法. 分治法:把一个难以解决的大问题分为若干规模较小的相同问题,以便各个击破,分而治之. 常见的递归算法,如: int fun(int n) { if(n==0||n==1) return 1; else return n*fun(n-1); } 二.排序算法 可以参考之前的博客: http://blog.csdn.net/qzp1991/article/det

图论常用算法总结

一.图的可行遍历 1)欧拉图 条件:1.图连通:2.奇度点数为0或2: 算法(一次dfs) 时间复杂度O(E),空间复杂度O(E) 1 //前向星,vis[]标记走过的边,cnt初始为1,i的反向边为i^1 2 void addedge (int u, int v) { 3 edge[++cnt].v = v,edge[cnt].ne = head[u]; 4 head[u] = cnt; 5 } 6 void EulerianP (int x) { 7 for (int i = head[x]