欧拉道路、欧拉回路
来源:互联网 发布:matlab面向对象编程 编辑:程序博客网 时间:2024/04/29 02:54
1、HDU 1878 欧拉回路
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <set>#include <cmath>#include <cctype>#include <ctime>#include <cassert>using namespace std;#define REP(i, n) for (int i = 0; i < (n); ++i)#define eps 1e-9typedef long long ll;typedef pair<int, int> Pair;const int INF = 0x7fffffff;const int maxn = 1e3 + 10;int degree[maxn], pre[maxn];int find_root(int x);void join_union(int x, int y);int main() {#ifdef __AiR_H freopen("in.txt", "r", stdin);#endif // __AiR_H int N, M, a, b; while (scanf("%d", &N) && N != 0) { scanf("%d", &M); memset(degree, 0, sizeof(degree)); for (int i = 1; i <= N; ++i) { pre[i] = i; } REP(i, M) { scanf("%d %d", &a, &b); ++degree[a]; ++degree[b]; join_union(a, b); } int ancestors = find_root(1); bool flag = true; for (int i = 1; i <= N; ++i) { if (degree[i] & 1 || find_root(i) != ancestors) { flag = false; break; } } if (flag) { printf("1\n"); } else { printf("0\n"); } }#ifdef __AiR_H printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);#endif // __AiR_H return 0;}int find_root(int x) { int r = x; while (r != pre[r]) { r = pre[r]; } while (pre[x] != r) { int t = pre[x]; pre[x] = r; x = t; } return r;}void join_union(int x, int y) { int fx = find_root(x), fy = find_root(y); if (fx != fy) { pre[fx] = fy; }}
2、HDU 1116 Play on Words
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <set>#include <cmath>#include <cctype>#include <ctime>#include <cassert>using namespace std;#define REP(i, n) for (int i = 0; i < (n); ++i)#define eps 1e-9typedef long long ll;typedef pair<int, int> Pair;const int INF = 0x7fffffff;const int maxn = 50;int in_degree[maxn], out_degree[maxn], pre[maxn];char str[1010];int find_root(int x);void join_union(int x, int y);int main() {#ifdef __AiR_H freopen("in.txt", "r", stdin);#endif // __AiR_H int T, N, len, t_1, t_2; scanf("%d", &T); while (T--) { memset(in_degree, 0, sizeof(in_degree)); memset(out_degree, 0, sizeof(out_degree)); for (int i = 1; i <= 26; ++i) { pre[i] = i; } scanf("%d", &N); REP(i, N) { scanf("%s", str); len = strlen(str); t_1 = str[0] - 'a' + 1; t_2 = str[len - 1] - 'a' + 1; join_union(t_1, t_2); ++in_degree[t_1]; ++out_degree[t_2]; } int ancestors = 0; bool in_flag = false, out_flag = false; for (int i = 1; i <= 26; ++i) { if (in_degree[i] || out_degree[i]) { ancestors = find_root(i); break; } } bool flag = true; for (int i = 1; i <= 26; ++i) { if ((in_degree[i] || out_degree[i]) && find_root(i) != ancestors) { flag = false; break; } if (in_degree[i] != out_degree[i]) { if (in_degree[i] - out_degree[i] == 1) { if (in_flag) { flag = false; break; } in_flag = true; } else if (out_degree[i] - in_degree[i] == 1) { if (out_flag) { flag = false; break; } out_flag = true; } else { flag = false; break; } } } if (flag) { printf("Ordering is possible.\n"); } else { printf("The door cannot be opened.\n"); } }#ifdef __AiR_H printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);#endif // __AiR_H return 0;}int find_root(int x) { int r = x; while (r != pre[r]) { r = pre[r]; } while (pre[x] != r) { int t = pre[x]; pre[x] = r; x = t; } return r;}void join_union(int x, int y) { int fx = find_root(x), fy = find_root(y); if (fx != fy) { pre[fx] = fy; }}
3、POJ 2337 Catenyms
参考:http://acm.student.cs.uwaterloo.ca/~acm00/030125/data/ C题
http://www.cnblogs.com/kuangbin/p/3537544.html
标程跑了157ms...
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <set>#include <cmath>#include <cctype>#include <ctime>#include <cassert>using namespace std;#define REP(i, n) for (int i = 0; i < (n); ++i)#define eps 1e-9typedef long long ll;typedef pair<int, int> Pair;struct Str { char s[50];};const int INF = 0x7fffffff;const int maxn = 1e3 + 10;Str str[maxn];int in[50], out[50], pre[50];int Next[maxn], to[maxn], head[maxn], index[maxn], edge;int ans[maxn], ans_cnt = 0;bool vis[maxn];int find_root(int x);void join_union(int x, int y);void init(void);void add_edge(int u, int v, int _index) { to[edge] = v; Next[edge] = head[u]; vis[edge] = false; index[edge] = _index; head[u] = edge++;}void dfs(int u);bool cmp(const Str &s1, const Str &s2) { return (strcmp(s1.s, s2.s) < 0) ? true : false;}int main() {#ifdef __AiR_H freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout);#endif // __AiR_H int T, n, len, t_1, t_2; scanf("%d", &T); while (T--) { init(); scanf("%d", &n); memset(in, 0, sizeof(in)); memset(out, 0, sizeof(out)); for (int i = 1; i <= 26; ++i) { pre[i] = i; } REP(i, n) { scanf("%s", str[i].s); } sort(str, str + n, cmp); int Min = INF; for (int i = n - 1; i >= 0; --i) { len = strlen(str[i].s); t_1 = str[i].s[0] - 'a' + 1; t_2 = str[i].s[len - 1] - 'a' + 1; add_edge(t_1, t_2, i); ++in[t_1]; ++out[t_2]; join_union(t_1, t_2); Min = min(Min, min(t_1, t_2)); } int ancestor = 0, in_key = 0, out_key = 0; for (int i = 1; i <= 26; ++i) { if (in[i] || out[i]) { ancestor = find_root(i); break; } } bool flag = true; for (int i = 1; i <= 26; ++i) { if (!in[i] && !out[i]) { continue; } if (find_root(i) != ancestor) { flag = false; break; } if (in[i] - out[i] == 1) { if (in_key) { flag = false; break; } in_key = i; } else if (out[i] - in[i] == 1) { if (out_key) { flag = false; break; } out_key = i; } else if (in[i] != out[i]) { flag = false; break; } } if (!flag) { printf("***\n"); continue; } if (!in_key && !out_key) { in_key = Min; } else if (!(in_key && out_key)) { flag = false; } if (!flag) { printf("***\n"); continue; } ans_cnt = 0; dfs(in_key); for (int i = ans_cnt - 1; i > 0; --i) { printf("%s.", str[ans[i]].s); } printf("%s\n", str[ans[0]].s); }#ifdef __AiR_H printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);#endif // __AiR_H return 0;}void dfs(int u) { for (int i = head[u]; i != -1; i = Next[i]) { if (!vis[i]) { vis[i] = true; dfs(to[i]); ans[ans_cnt++] = index[i]; } }}void init(void) { memset(head, -1, sizeof(head)); memset(vis, false, sizeof(vis)); edge = 0;}int find_root(int x) { int r = x; while (r != pre[r]) { r = pre[r]; } while (pre[x] != r) { int t = pre[x]; pre[x] = r; x = t; } return r;}void join_union(int x, int y) { int fx = find_root(x), fy = find_root(y); if (fx != fy) { pre[fx] = fy; }}
0 0
- 欧拉回路与欧拉道路
- 欧拉道路 和 欧拉回路
- 欧拉回路,欧拉道路
- 欧拉回路与欧拉道路
- 欧拉道路、欧拉回路
- 欧拉回路与欧拉道路
- 欧拉回路(道路)
- 欧拉道路(回路)的判断
- UVa_10129_欧拉道路(回路)详解
- 欧拉道路与欧拉回路算法
- poj2337 字典序 欧拉回路/欧拉道路
- HDU 5883 The Best Path(欧拉道路+回路)
- HDU1878 欧拉回路【欧拉回路】
- 欧拉回路判断
- 欧拉回路 hdu1878
- 欧拉回路
- 欧拉回路
- 欧拉回路
- 虚幻UE4的后处理特效介绍
- Flume+HDFS+Kafka+Hive实例搭建
- Java虚拟机学习 - 对象内存分配与回收
- 线性表之链表
- ODDR2
- 欧拉道路、欧拉回路
- HDU - 3567 IDA* + 曼哈顿距离 + 康托 [kuangbin带你飞]专题二
- 微信公众号开发模板消息推送(一) 获取access_token java
- 编译BoostrapV3 Sass版本的源码(涉及Ruby、Sass、Compass、Watcher的配置)
- [建筑可视化]Evermotion-Archinteriors for UE4
- tomcat集成在eclipse上面步骤
- .NET 即时通信,WebSocket服务端实例
- Java虚拟机学习 - 类加载机制
- 太空梯