BestCoder Round #53
2015-08-29 22:13
246 查看
现在博客更新比较少了,就当我还活着吧
AC代码:
AC代码:
官方题解:
如果图是连通的,可以发现如果存在哈密顿路径,一定有一条哈密顿路径的一端是度数最小的点,从那个点开始直接DFS搜索哈密顿路径复杂度是O(n)的。要注意先判掉图不连通的情况。
AC代码:
Rikka with Graph
题目传送:HDU - 5422 - Rikka with GraphAC代码:
[code]#include <map> #include <set> #include <list> #include <cmath> #include <deque> #include <queue> #include <stack> #include <bitset> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <complex> #include <cstdlib> #include <cstring> #include <fstream> #include <sstream> #include <utility> #include <iostream> #include <algorithm> #include <functional> #define LL long long #define INF 0x7fffffff using namespace std; int n, m; int main() { while(scanf("%d %d", &n, &m) != EOF) { int u, v; int flag = 0; for(int i = 0; i < m; i ++) { scanf("%d %d", &u, &v); if((u == 1 && v == n) || (u == n && v == 1)) flag = 1; } if(flag == 1) printf("1 %d\n", n * (n - 1) / 2); else printf("1 1\n"); } return 0; }
Rikka with Tree
题目传送:HDU - 5423 - Rikka with TreeAC代码:
[code]#include <map> #include <set> #include <list> #include <cmath> #include <deque> #include <queue> #include <stack> #include <bitset> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <complex> #include <cstdlib> #include <cstring> #include <fstream> #include <sstream> #include <utility> #include <iostream> #include <algorithm> #include <functional> #define LL long long #define INF 0x7fffffff using namespace std; const int maxn = 1005; int n; vector<int> G[maxn]; bool judge1() { if(G[1].size() <= 0 || G[1].size() >= 2) { return false; } int pre = 1; int v = G[1][0]; while(G[v].size() == 2) { for(int i = 0; i < 2; i ++) { if(G[v][i] != pre) { pre = v; v = G[v][i]; if(G[v].size() == 1) return true; break; } } } return false; } bool judge2() { if(G[1].size() != n - 1) return false; return true; } bool judge3() { if(G[1].size() != 1) { return false; } int cnt = 1; int pre = 1; int v = G[1][0]; while(G[v].size() == 2) { for(int i = 0; i < 2; i ++) { if(G[v][i] != pre) { pre = v; v = G[v][i]; cnt ++; break; } } if(G[v].size() != 2) break; } //cout << n << " " << cnt << endl; if(G[v].size() == n - cnt) return true; return false; } int main() { while(scanf("%d", &n) != EOF) { for(int i = 0; i < maxn; i ++) G[i].clear(); int u, v; for(int i = 1; i < n; i ++) { scanf("%d %d", &u, &v); G[u].push_back(v); G[v].push_back(u); } if(judge1() || judge2() || judge3()) { printf("YES\n"); } else printf("NO\n"); } return 0; }
Rikka with Graph II
题目传送:HDU - 5424 - Rikka with Graph II官方题解:
如果图是连通的,可以发现如果存在哈密顿路径,一定有一条哈密顿路径的一端是度数最小的点,从那个点开始直接DFS搜索哈密顿路径复杂度是O(n)的。要注意先判掉图不连通的情况。
AC代码:
[code]#include <map> #include <set> #include <list> #include <cmath> #include <deque> #include <queue> #include <stack> #include <bitset> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <complex> #include <cstdlib> #include <cstring> #include <fstream> #include <sstream> #include <utility> #include <iostream> #include <algorithm> #include <functional> #define LL long long #define INF 0x7fffffff using namespace std; const int maxn = 1005; int n; vector<int> G[maxn]; map<pair<int, int>, int> mp; int deg[maxn]; int vis[maxn]; bool dfs(int u, int cnt) { vis[u] = 1; if(cnt == n) return true; int d = G[u].size(); for(int i = 0; i < d; i ++) { int v = G[u][i]; if(!vis[v]) { if(dfs(v, cnt + 1)) return true; vis[v] = 0; } } return false; } int cnt; void judge(int u) { vis[u] = 1; cnt ++; int d = G[u].size(); for(int i = 0; i < d; i ++) { int v = G[u][i]; if(!vis[v]) { judge(v); } } } int main() { while(scanf("%d", &n) != EOF) { for(int i = 0; i <= n; i ++) G[i].clear(); mp.clear(); memset(deg, 0, sizeof(deg)); int u, v; for(int i = 0; i < n; i ++) { scanf("%d %d", &u, &v); if(u == v) continue; if(mp.find(make_pair(u, v)) != mp.end() || mp.find(make_pair(v, u)) != mp.end() ) { continue; } G[u].push_back(v); G[v].push_back(u); deg[u] ++; deg[v] ++; mp[make_pair(u, v)] = 1; } int mi = INF; int id; for(int i = 1; i <= n; i ++) { if(deg[i] < mi) { mi = deg[i]; id = i; } } memset(vis, 0, sizeof(vis)); cnt = 0; judge(1);//特判不连通的情况,因为如果不连通直接dfs会因为回溯太多次而超时 if(cnt != n) { printf("NO\n"); continue; } memset(vis, 0, sizeof(vis)); //cout<< id << endl; if(dfs(id, 1)) { printf("YES\n"); } else printf("NO\n"); } return 0; }
相关文章推荐
- PullScrollView详解(六)——延伸拓展(listview中getScrollY()一直等于0、ScrollView中的overScrollBy)
- 讯飞在线语音合成
- 增加个人博客地址,欢迎访问
- 统计数据的类型的划分
- HDU 5422:Rikka with Graph
- [C++]Kth Smallest Element in a BST 在一个二叉排序树中找第k小的元素
- C模板实现STL容器中的vector
- LeetCode Linked List Cycle
- 二叉树的建立
- 用Python实现基本排序算法03——插入排序
- javascript 面向对象
- AJAX 跨域 :Access-Control-Allow-Origin
- LeetCode Linked List Cycle
- 编写灵活、稳定、高质量的 HTML 和 CSS 代码的规范。
- TextNut文件保存路径
- Linux 内存管理机制
- Windows系统下Python与NumPy安装方法
- Python str字符串常用到的函数
- Linux入手
- Java进程的创建