首页 > 其他分享 >204 汉密尔顿回路

204 汉密尔顿回路

时间:2024-08-14 16:49:19浏览次数:6  
标签:cnt return 204 idx int vis 汉密尔顿 回路

// 204 汉密尔顿回路.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
http://oj.daimayuan.top/course/14/problem/632


给你一张无向简单图,请问能否从指定起点出发找到一条汉密尔顿回路。

输入格式
第一行两个整数 n,m,表示图的顶点数和边数,顶点编号从 1到 n。

接下来 m行,每行两个整数 x,y,表示 x号点和 y号点之间有一条边。

接下来一行,一个整数 k,表示起始节点编号。

输出格式 
输出一行一个字符串,如果能找到从 k号点出发的汉密尔顿回路,输出 Yes, 否则输出 No。

样例输入
4 5
1 2
2 3
1 3
1 4
2 4
4
样例输出
Yes
数据规模
对于所有数据,保证 2≤n≤8,0≤m≤n(n−1)/2,1≤x,y,k≤n。
*/


#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <cstring>


using namespace std;

const int N = 10, M = 60;
int h[N], e[M], ne[M], idx;
int n, m, k;
int vis[N], cnt;

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}


bool dfs(int x) {
	vis[x] = 1; cnt++;
	if (cnt == n && x == k) {
		return true;
	}
	else if (cnt == n) {
		vis[x] = 0; cnt--;
		return false;
	}

	for (int i = h[x]; i != -1; i=ne[i]) {
		int j = e[i];
		if (vis[j]==0 && dfs(j)) return true;
	}
	vis[x] = 0; cnt--;

	return false;
}


int main() {
	cin >> n >> m ;
	memset(h, -1, sizeof h);
	for (int i = 0; i < m; i++) {
		int a, b; cin >> a >> b;
		add(a, b); add(b, a);
	}
	cin >> k;
	int flag = 0;
	for (int i = 1; i <= n; i++) {
		if (i == k) continue;
		if (dfs(i)) {
			flag = 1;
			break;
		}
	}

	if (flag) cout << "Yes" << endl;
	else cout << "No" << endl;

	return 0;
}

标签:cnt,return,204,idx,int,vis,汉密尔顿,回路
From: https://www.cnblogs.com/itdef/p/18359331

相关文章

  • panic: 8e85653db463fe36 state.commit 942043166 is out of range [939698375, 93970
    根据您提供的日志信息,看起来您的etcd服务遇到了一个panic错误,具体是因为state.commit的索引值942043166超出了预期的范围[939698375,939700076]。这种情况可能是由于etcd集群中的数据不一致导致的。首先,您可以尝试查看etcd集群的状态,确认所有成员是否都在正......
  • 算法随笔——欧拉回路
    学习链接oiwiki定义判别方法P7771【模板】欧拉路径(有向图)P7771【模板】欧拉路径#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineINF0x3f3f3f3f#definereregister#definePIIpair<int,int>intread(){ intf=1,k=0;charc=get......
  • 2070 欧拉回路--[中等+]
    #include<iostream>usingnamespacestd;//arr记录邻接矩阵dot记录奇点(每个点连接边数量)ans数组存储结果 intarr[105][105],dot[105],n,m,ans[105];//记录奇点intstart[3],sum=0; //x正在到达的结点cnt是数组ans的下标voiddfs(intx,intcnt){   //边......
  • Leetcode每日一题 202040726 2740.找出分区值
    题目描述给你一个正整数数组nums。将nums分成两个数组:nums1和nums2,并满足下述条件:数组nums中的每个元素都属于数组nums1或数组nums2。两个数组都非空。分区值最小。分区值的计算方法是|max(nums1)-min(nums2)|。其中,max(nums1)表示数组nums1......
  • 【笔记】图论:2-sat、连通性、欧拉回路选讲
    [AGC059C]GuessingPermutationforasLongasPossible(2-sat)这个东西十分智障,只需要对于所有\(a,b,c\),如果询问顺序是\((a,b),(b,c),(a,c)\),那么不能\(a<b<c\)或\(a>b>c\)。其它的情况(一条链)你一看发现肯定需要出现上述情况,那么这就是充要条件。你一看你直接对所......
  • JESD204B学习与仿真
    平台:vivado2018.3芯片:xcku115-flva1517-2-i场景:在高速ADC和DAC芯片中,有使用源同步的时钟和数据同步传输的方式,但是需要在逻辑内部对其进行校准。如果使用jesd204b接口传输数据,设计人员不需要了解复杂的校准流程,只需要向该接口写入数据,或者从该接口读出数据。IP手册下载地址:......
  • 2048小游戏【C语言版】单文件编写
    设计思路游戏地图和初始设置:使用一个4x4的二维数组map来表示游戏地图。初始时,所有位置的值均为0。score记录玩家得分,move_num记录移动次数。随机生成数字:在地图上随机选择一个空位置生成2或4。只有在地图发生变化时才会生成新数字。游戏菜单:使用m......
  • Warning[204-68] 以及 Vivado HLS与Vivado的资源差异
            这篇学习记录起源于项目以ip导出后,在HLS综合(synthesis)资源与Vivado内ip综合(synthesis)存在巨大差异,本文没有数据仅以文字记录。        所有问题均基于VivadoHLS2019.1。目录1、资源差异1.1、首先vivado内的ip综合分为Global和Out-Of-Context两......
  • 0204-可移动相机
    环境Time2022-11-17WSL-Ubuntu22.04Rust1.65.0前言说明参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html目标将相机的位置和远近参数化,可以调节相机的位置。叉乘//向量的叉乘pubfncross(self,other:Vector3)->Vector3{Vector3{......
  • 欧拉图、欧拉路径、欧拉回路
    P7771【模板】欧拉路径欧拉路径的模板题。思路首先判断是否有欧拉路径,然后排序,找出起点,最后dfs找路径。代码细节多,比如要判断一个点是否存在(这个题目不需要)。#include<bits/stdc++.h>usingnamespacestd;constintN=100010;vector<int>e[N];inthead[N],in......