• Domino SGU


    题意:n个诺米骨牌,每个骨牌的两面都有数字(0 ~ 6),求n个骨牌的一个排列,满足相邻骨牌相邻的一面的数字相同。

    题解:每张骨牌当作一条边,啥意思呢?比如说第一张骨牌的两面是3和4,那么就在3和4之间连一条编号为1的无向边,建好图好,判断这张图能不能一笔画完,也就是一条欧拉路径能不能覆盖完所有的边。

    PS:注意图可能是不连通,测试点4就是有多个连通块。

    #include "stdafx.h"
    #pragma warning(disable:4996)
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #define ll long long
    #define P pair<int, int>
    #define PP pair<int,pair<int, int>>
    #define pb push_back
    #define pp pop_back
    #define lson root << 1
    #define INF (int)2e9 + 7
    #define rson root << 1 | 1
    #define LINF (unsigned long long int)1e18
    #define mem(arry, in) memset(arry, in, sizeof(arry))
    using namespace std;
    
    const int N = 100005;
    
    int n, tot;
    int head[10], use[300], deg[10];
    
    vector<int> ans;
    
    struct node { int to, next, id; } e[300];
    
    void Inite() {
        tot = 0;
        mem(head, -1), mem(use, 0), mem(deg, 0);
    }
    
    void addedge(int u, int v, int id) {
        e[tot].to = v;
        e[tot].id = id;
        e[tot].next = head[u];
        head[u] = tot++;
    }
    
    void DFS(int u) {
        for (int i = head[u]; i != -1; i = e[i].next) {
            int v = e[i].to;
            if (!use[i]) {
                use[i] = use[i ^ 1] = 1;
                DFS(v);   
                ans.pb(e[i].id);
            }
        }
    }
    
    void Solve() {
        int cnt = 0, pos = -1;
        for (int i = 0; i <= 6; i++) if (deg[i] && (deg[i] & 1)) cnt++, pos = i;
        if (cnt != 0 && cnt != 2) puts("No solution");
        else {
            if (pos == -1) {
                for (int i = 0; i <= 6; i++) if (deg[i]) pos = i;
            }
            DFS(pos);
            if (ans.size() != n) {
                puts("No solution");
                return;
            }
            for(int i = ans.size() - 1; i >= 0; i--) {
                if (ans[i] > 0) printf("%d +
    ", ans[i]);
                else printf("%d -
    ", -ans[i]);
            }
        }
        ans.clear();
    }
    
    int main()
    {
        while (scanf("%d",&n) != EOF) {
            Inite();
            for (int i = 1; i <= n; i++) {
                int u, v;
                scanf("%d %d", &u, &v);
                addedge(u, v, i);
                addedge(v, u, -i);
                deg[u]++;
                deg[v]++;
            }
            Solve();
        }
        return 0;
    }
  • 相关阅读:
    【SSM】Eclipse使用Maven创建Web项目+整合SSM框架(转自:http://www.cnblogs.com/DoubleEggs/p/6243216.html)
    odoo Wkhtmltopdf failed (error code: -11). Memory limit too low or maximum file number of subprocess reached. Message : b''
    odoo 补货规则,当某个位置的产品匹配到多个规则时优先使用序列号最小的规则
    odoo 销售订单确认怎么触发的发货规则
    linux 内核升级
    linux 运维工具之jumpserver
    odoo 关于odoo 的批量拣货
    JIT
    sping+redis实现消息队列的乱码问题
    JVM参数设置
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/9393062.html
Copyright © 2020-2023  润新知