欧拉道路、欧拉回路

来源:互联网 发布: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
原创粉丝点击