题意:给一张无向图,判断是否是哈密顿图。
哈密顿路:经过每个点有且仅有一次的一条通路。
方法:每次找度数最小的点作为起点,然后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 }