hdu 5424(dfs搜索)

来源:互联网 发布:招聘数据统计分析表 编辑:程序博客网 时间:2024/05/20 11:49

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5424

官方题解:

如果图是联通的,可以发现如果存在哈密顿路径,一定有一条哈密顿路径的一端是度数最小的点,从哪个点开始直接DFS搜索哈密顿路径复杂度是 O(n) 的。要注意先判掉图不连通的情况。  

#include<iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;const int maxn = 1005;int n,flag,mat[maxn][maxn],degree[maxn];bool vis[maxn];void dfs(int u,int depth){if(flag) return;vis[u] = true;if(depth == n){flag = 1;return;}for(int i = 1; i <= n && !flag; i++){if(vis[i] == true || mat[u][i] == 0) continue;dfs(i,depth+1);vis[i] = false; //必须要消除标记,不能一条路走到死}}int main(){int u,v;while(scanf("%d",&n)!=EOF){memset(mat,0,sizeof(mat));memset(degree,0,sizeof(degree));for(int i = 1; i <= n; i++){scanf("%d%d",&u,&v);if(u != v && mat[u][v] == 0){mat[u][v] = mat[v][u] = 1;degree[u]++; degree[v]++;}}memset(vis,false,sizeof(vis));int tot = 0,rt = 1;for(int i = 1; i <= n; i++)if(degree[i] == 1){tot++;rt = i;}if(tot > 2) //需要特判一下,否则TLE{printf("NO\n");continue;}flag = 0;dfs(rt,1);if(flag == 1) printf("YES\n");else printf("NO\n");}return 0;}


0 0