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