判断是否是哈密顿图--HDU 5424

题意:给一张无向图,判断是否是哈密顿图。

哈密顿路:经过每个点有且仅有一次的一条通路。

方法:每次找度数最小的点作为起点,然后dfs整个图,看能遍历到的点的数目能否达到n。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<ctime>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<climits>
10 #include<set>
11 using namespace std;
12 const int maxn=1100,inf=1E9;
13 vector<int>g[maxn];
14 int n,vis[maxn],dep,cnt;
15 bool dfs(int u)
16 {
17     if(dep == n)
18         return true;
19     for(int i=0; i<g[u].size(); i++)
20     {
21         int v = g[u][i];
22         if(vis[v])
23             continue;
24         vis[v] = true;
25         dep++;
26         if(dfs(v))
27             return true;
28         dep -- ;
29         vis[v] = 0;
30     }
31     return false;
32 }
33 int main()
34 {
35     int u,v;
36     while(scanf("%d",&n) != -1)
37     {
38         for(int i=1; i<=n; i++)
39             g[i].clear();
40         for(int i=1; i<=n; i++)
41         {
42             scanf("%d%d",&u,&v);
43             g[u].push_back(v);
44             g[v].push_back(u);
45         }
46         int head=0,cnt=0;
47         for(int i=1; i<=n; i++)
48             if(g[i].size() == 1)
49             {
50                 head=i;///找起点
51                 cnt++;
52             }
53         if(cnt>2)///如果度数为1的点超过两个
54         {
55             puts("NO");
56             continue;
57         }
58         memset(vis,0,sizeof(vis));
59         if(head == 0)
60             head=1;///没有度数为1,即是个环
61         dep=1;
62         if(dfs(head))
63             puts("YES");
64         else puts("NO");
65     }
66 }

时间: 2024-11-13 06:49:54

判断是否是哈密顿图--HDU 5424的相关文章

hdu 5424 Rikka with Graph II (BestCoder Round #53 (div.2))(哈密顿通路判断)

http://acm.hdu.edu.cn/showproblem.php?pid=5424 哈密顿通路:联通的图,访问每个顶点的路径且只访问一次 n个点n条边 n个顶点有n - 1条边,最后一条边的连接情况: (1)自环(这里不需要考虑): (2)最后一条边将首和尾连接,这样每个点的度都为2: (3)最后一条边将首和除尾之外的点连接或将尾和出尾之外的点连接,这样相应的首或尾的度最小,度为1: (4)最后一条边将首和尾除外的两个点连接,这样就有两个点的度最小,度都为1 如果所给的图是联通的话,那

hdu 5424 回溯+并查集判断连通性

题意:给定一个n个点n条边的无向图,判断是否存在哈密顿路径. 思路:先用并查集判断图是否连通,然后从度数最小的点开始回溯,看是否能找到一条哈密顿路径. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <set> 5 using namespace std; 6 7 const int INF = 999999; 8 const int N = 1001; 9

hdu 5424 Rikka with Graph II 哈密顿通路

Rikka with Graph II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 367    Accepted Submission(s): 90 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situatio

HDU 5424——Rikka with Graph II——————【哈密顿路径】

Rikka with Graph II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1051    Accepted Submission(s): 266 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situati

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>

哈密顿图 BestCoder Round #53 (div.2) 1003 Rikka with Graph II

题目传送门 题意:判断是否为哈密顿图 分析:首先一种情况是不合法的:也就是度数为1的点超过2个:合法的有:,那么从度数为1的点开始深搜,如果存在一种走法能够走完n个点那么存在哈密顿路 收获:学习资料 代码: /************************************************ * Author :Running_Time * Created Time :2015-8-29 20:37:34 * File Name :C.cpp *******************

BestCoder Round #53

现在博客更新比较少了,就当我还活着吧 Rikka with Graph 题目传送:HDU - 5422 - Rikka with Graph AC代码: #include <map> #include <set> #include <list> #include <cmath> #include <deque> #include <queue> #include <stack> #include <bitset>

计算几何学习9

没有学特定的姿势 做了第二期的一些普通题 发现了自己很容易犯的一些错误 HDU 3264 给你一些互不相交,互不内含的圆,寻找一个最小的半径,使得在某点圆心处以该半径作圆时可以覆盖每个圆至少一半的面积 一看就是二分加两圆的面积交了,但是很智障的是,我当时并没有直接去求交集面积,而是额外去求了圆的交点,并且是求了两个弓形的面积之和 这样讨论起来就麻烦了,圆的优弧情况是对应扇形加上三角形,劣弧是减去,判断优弧劣弧的条件是一方半径平方大于另一方半径加上圆心距平方 不过还是写过了= = 当是敲了一个圆的

Book---强连通分量

这几天一直在做强连通,现在总结一小下 1.定义 在一个有向图中,如果任意的两个点都是相互可达的,就说这个图是强连通的,有向图的极大强连通子图,称为强连通分量 2.求法 学的是白书上的tarjan算法 用到了DFS的时间戳 假设一个强连通分量C,其中的第一个点是 P,那么DFS下去,就一定能够找到一个K点,返回P点,这条DFS路径上的点就处于这个强连通分量C中 假如现在发现节点v,同时发现节点v最远只能够到达节点u,那么节点u就是这个强连通分量最先被发现的节点 这样就转化成了求一个点u最远能够到达