判断是否存在哈密顿路--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 }
View Code

 

原文地址:https://www.cnblogs.com/ACMERY/p/4771259.html