Description:

给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的。

解题思路:

可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点,把木棒看成边,这样相同的颜色就是同一个节点

问题便转化为:

给定一个图,是否存在“一笔画”经过涂中每一点,以及经过每一边一次。

这样就是求图中是否存在欧拉路Euler-Path。(我才知道这个就是欧拉路径。。。T_T)

由图论知识可以知道,无向图存在欧拉路的充要条件为:

①     图是连通的;  // 用并查集判断就好啦。

②     所有节点的度为偶数,或者有且只有两个度为奇数的节点。

附代码(虽然有点小疑问):

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#define maxn 500000 + 100
using namespace std;

int fa[maxn];
int du[maxn];
int cnt;

void init()
{
    int i;
    for (i=0; i<maxn; ++i)
    {
        fa[i] = i;
    }
    cnt = 0;
}

int find(int v)
{
    if (fa[v] == v) return v;
    return fa[v] = find(fa[v]);
}

void unin(int x, int y)
{
    int fx = find(x);
    int fy = find(y);
    if (fx != fy)
      fa[fx] = fy;
}

struct trie
{
    trie *next[26];
    int key;
    bool isleaf;
    trie()
    {
        for (int i=0; i<26; ++i)
        {
            next[i] = NULL;
        }
        key = 0;
        isleaf = false;
    }
}Root, Node;

int creatTree(char word[])
{
    trie *p = &Root;
    char *str = word;
    while(*str)
    {
       if (p->next[*str-'a'] == NULL)
        p->next[*str-'a'] = new trie;
       p = p->next[*str-'a'];
       str++;
    }
    if (p->isleaf)
        return p->key;
    else
    {
        p->isleaf = true;
        p->key = cnt++;
        return p->key;
    }
}

int main()
{
    char str1[20], str2[20];
    init();
    while(~scanf("%s%s", str1, str2))
    {
        int a, b;
        a = creatTree(str1);
        b = creatTree(str2);
        du[a]++;   // T_T 还是布吉岛为什么。如果这两种颜色已经属于一个集合了。为什么还要度数++呢。所以。额。
        du[b]++;
        if (find(a) != find(b))
        {
//            du[a]++;
//            du[b]++;
            unin(a, b);
        }
    }
    int temp = 0;
    for (int i=0; i<cnt; ++i)
    {
        if (du[i] % 2)
            temp++;
    }
    if (temp != 0 && temp != 2)
    {
        printf("Impossible\n");
        return 0;
    }
    int ttemp = find(0);
    for (int i=1; i<cnt; ++i)
    {
        if (find(i) != ttemp)
        {
            printf("Impossible\n");
            return 0;
        }
    }
    printf("Possible\n");
    return 0;
}

POJ 2513 字典树+并查集+欧拉路径的更多相关文章

  1. POJ 2513 trie树+并查集判断无向图的欧拉路

    生无可恋 查RE查了一个多小时.. 原因是我N define的是250500 应该是500500!!!!!!!!! 身败名裂,已无颜面对众人.. 吐槽完了 我们来说思路... 思路: 判有向图能否形成 ...

  2. POJ 2513 Colored Sticks(欧拉道路+字典树+并查集)

    http://poj.org/problem?id=2513 题意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 思路: 题目很明 ...

  3. nyoj 230/poj 2513 彩色棒 并查集+字典树+欧拉回路

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=230 题意:给你许许多多的木棍,没条木棍两端有两种颜色,问你在将木棍相连时,接触的端点颜色 ...

  4. POJ 2513 无向欧拉通路+字典树+并查集

    题目大意: 有一堆头尾均有颜色的木条,要让它们拼接在一起,拼接处颜色要保证相同,问是否能够实现 这道题我一开始利用map<string,int>来对颜色进行赋值,好进行后面的并查操作以及欧 ...

  5. POJ 2513 Colored Sticks (欧拉回路 + 字典树 +并查集)

    Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 27097   Accepted: 7175 ...

  6. poj2513 Colored Sticks —— 字典树 + 并查集 + 欧拉回路

    题目链接:http://poj.org/problem?id=2513 题解:通过这题了解了字典树.用字典树存储颜色,并给颜色编上序号.这题为典型的欧拉回路问题:将每种颜色当成一个点.首先通过并查集判 ...

  7. POJ2513Colored Sticks(欧拉通路)(字典树)(并查集)

                                                             Colored Sticks Time Limit: 5000MS   Memory ...

  8. PKU 2513 Colored Sticks(并查集+Trie树+欧拉路径(回路))

    题目大意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相连接的一端必须是同颜色的. 解题思路: 可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点 ...

  9. [WC2005]双面棋盘(线段树+并查集)

    线段树+并查集维护连通性. 好像 \(700ms\) 的时限把我的常数超级大的做法卡掉了, 必须要开 \(O_2\) 才行. 对于线段树的每一个结点都开左边的并查集,右边的并查集,然后合并. \(Co ...

随机推荐

  1. ubuntu下如何修改时区和时间

    1.修改时区 sudo tzselect (按提示选择即可) sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 2. 修改时间 sudo ...

  2. RHEL7使用NAT方式上网

    1.首先,Windows7无法设置网络共享VMNet8的问题,是因为禁用了Firewall服务,设置为自动,启用即可:且需要启动VMWare的DHCP和NAT两个服务,这两个服务在我的机器上是关闭的, ...

  3. 【打分策略】Elasticsearch打分策略详解与explain手把手计算

    一.目的 一个搜索引擎使用的时候必定需要排序这个模块,一般情况下在不选择按照某一字段排序的情况下,都是按照打分的高低进行一个默认排序的,所以如果正式使用的话,必须对默认排序的打分策略有一个详细的了解才 ...

  4. CodeForces 1105E

    题目链接 std:meet in the middle 首先把所有的点分成两部分,设\(f_i\)为前半部分在点集\(i\)中选出的最大独立集,\(g\)为在后半部分选.这个可以在\(O(2^{m/2 ...

  5. java进制转换代码

    定义十进制的数直接写,定义8进制的数以0开头,定义二进制的数以0b开头,定义十六进制的数以0x开头需要将十进制的数以二进制的数表示出来可以参照下例: int a = 10; System.out.pr ...

  6. shiro(1) 介绍

    一.什么是shiro (1)属性:java框架 (2)用途:身份验证.用户授权.加密.会话管理 (3)优点:轻量.易用 二.三大组件 (1)subject:代表当前主体,与当前应用交互的任何东西都是s ...

  7. java web项目配置https访问

      转载: tomcat6配置:  1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源  2.双向认证,如果客户端浏览器没有导入客户端证书,是访问不了web系统的,找不到地址  如果只是加 ...

  8. BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题

    题目: 给定一个大小为 N×M 的迷宫.迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格 的通道移动.请求出从起点到终点所需的最小步数.请注意,本题假定从起点一定可以移动 到终点. 限制条件;N, ...

  9. Nmap从探测到漏洞利用备忘录 – Nmap简介(一)

    在侦查期间,扫描一直是信息收集的初始阶段. 什么是侦查 侦查是尽可能多收集关于目标网络的信息.从黑客的角度来看,信息收集对于一次攻击非常有用,所以为了封锁恶意的企图,渗透测试者通常尽力查找这些信息,发 ...

  10. faster-rcnn 论文讲解

    Faster RCN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classification ...