题意:给你n个火柴棍,每个火柴棍头和尾两种颜色,问你是否存在能够把这些火柴棍摆成一行的情况,两个相连的火柴棍的颜色需要一样;

解题思路:最初的思路是用map标记颜色,然后把每种颜色看作点,每根火柴棍看作边,求欧拉路径,然后超时了。。。看了别人的写法,想起来了自己还学过字典树来着。。。然后用字典树找就行了,快很多

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=500050;
struct tnode
{
int pos;
bool exsit;
tnode *next[30];
tnode()
{
for(int i=0;i<26;i++)
next[i]=NULL;
pos=0;exsit=false;
}
};
tnode *root;
int x,y;
int flag;
int dfn;
int degree[maxn];
int f[maxn];
char s[15],t[15];
tnode* newnode()
{
tnode *p=new tnode;
for(int i=0;i<26;i++)
p->next[i]=NULL;
p->pos=0;p->exsit=false;
return p;
}
void build_trie(char *s)
{
tnode *p=root;
int slen=strlen(s);
for(int i=0;i<slen;i++)
{
int id=s[i]-'a';
if(p->next[id]==NULL)
{
p->next[id]=newnode();
}
p=p->next[id];
}
p->exsit=true;
p->pos=++dfn;
}
int query(char *s)
{
tnode *p=root;
int slen=strlen(s);
for(int i=0;i<slen;i++)
{
int id=s[i]-'a';
p=p->next[id];
if(p==NULL)
return 0;
}
if(p->exsit)
return p->pos;
}
int build(char *str)
{
int zz=query(str);
if(zz!=0)
return zz;
else
{
build_trie(str);
return dfn;
}
}
int findf(int u)
{
if(u==f[u])
return u;
else
{
f[u]=findf(f[u]);
return f[u];
}
}
void join(int x,int y)
{
int t1=findf(x);
int t2=findf(y);
if(t1!=t2)
f[t2]=t1;
}
int main()
{
root=newnode();
for(int i=1;i<=maxn;i++)
f[i]=i;
while(scanf("%s %s",s,t)!=EOF)
{
int x=build(s);
int y=build(t);
degree[x]++;degree[y]++;
join(x,y);
}
// cout<<dfn<<endl;
int cnt=0;
int fa=findf(1);
for(int i=2;i<=dfn;i++)
if(findf(i)!=fa)
flag=1;
if(flag)
{
printf("Impossible\n");return 0;
}
for(int i=1;i<=dfn;i++)
{
if(degree[i]!=0)
{
if((degree[i]&1)==1)
cnt++;
}
}
// cout<<cnt<<endl;
if(cnt==1||cnt>=3)
flag=1;
if(flag)
{
printf("Impossible\n");
}
else
printf("Possible\n");
}

  

poj-2513(字典树+欧拉通路)的更多相关文章

  1. poj 2513 连接火柴 字典树+欧拉通路 好题

    Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 27134   Accepted: 7186 ...

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

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

  3. poj2513- Colored Sticks 字典树+欧拉通路判断

    题目链接:http://poj.org/problem?id=2513 思路很容易想到就是判断欧拉通路 预处理时用字典树将每个单词和数字对应即可 刚开始在并查集处理的时候出错了 代码: #includ ...

  4. POJ 2513 字典树+并查集+欧拉路径

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

  5. Colored Sticks POJ - 2513 并查集+欧拉通路+字典树hash

    题意:给出很多很多很多很多个棒子 左右各有颜色(给出的是单词) 相同颜色的可以接在一起,问是否存在一种 方法可以使得所以棒子连在一起 思路:就是一个判欧拉通路的题目,欧拉通路存在:没奇度顶点   或者 ...

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

                                                             Colored Sticks Time Limit: 5000MS   Memory ...

  7. POJ 1300 欧拉通路&欧拉回路

    系统的学习一遍图论!从这篇博客开始! 先介绍一些概念. 无向图: G为连通的无向图,称经过G的每条边一次并且仅一次的路径为欧拉通路. 如果欧拉通路是回路(起点和终点相同),则称此回路为欧拉回路. 具有 ...

  8. POJ 1386 Play on Words(有向欧拉通路 连通图)

    题意  见下方中文翻译 每一个单词能够看成首尾两个字母相连的一条边  然后就是输入m条边  推断是否能构成有向欧拉通路了 有向图存在欧拉通路的充要条件: 1. 有向图的基图连通: 2. 全部点的出度和 ...

  9. ACM/ICPC 之 DFS求解欧拉通路路径(POJ2337)

    判断是欧拉通路后,DFS简单剪枝求解字典序最小的欧拉通路路径 //Time:16Ms Memory:228K #include<iostream> #include<cstring& ...

  10. hdu1116有向图判断欧拉通路判断

    Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

随机推荐

  1. Luogu P3165 [CQOI2014]排序机械臂

    先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...

  2. Java多线程编程核心技术(三)多线程通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  3. 关于Spring Data JPA更新部分字段的问题

    1.问题背景 个人比较喜欢Spring data JPA,这次的问题是在实体类中使用List类型作为字段,JPA也提供了操作的方法,即使用@ElementCollection注解,网上对于JPA的知识 ...

  4. 十五、bootstrap-select的使用方法

    参考来源https://www.cnblogs.com/nianyifenzhizuo/p/8119462.html 需要的css和js <link rel="stylesheet&q ...

  5. super关键字访问父类成员

    1.super只能出现在子类的方法和构造方法中: 2.super调用构造方法时只能是第一句: 3.super不能访问父类的private成员.

  6. 批量采集世纪佳缘会员图片及winhttp异步采集效率

    原始出处:http://www.cnblogs.com/Charltsing/p/winhttpasyn.html 最近老有人问能不能绕过世纪佳缘的会员验证来采集图片,我测试了一下,发现是可以的. 同 ...

  7. mysql创建数据库命令

    CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

  8. 【学习总结】GirlsInAI ML-diary day-1-初识Python-Anaconda-Jupyter

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day1 初识Python-Anaconda-Jupyter: 1-下载并安装Anaconda 官网下载,按指导安装 ana ...

  9. mysql uuid() 相同 重复

    mysql select UPPER(REPLACE(uuid(),'-','')) from xxxtable 得到相同的uuid的问题 - LWJdear的博客 - CSDN博客 https:// ...

  10. js-canvas(基本用法)

    ###1. canvas(画布) <canvas>是HTML 5 新增的元素,可用于通过使用JavaScript中的脚本来绘制图形 默认宽高为300px*150px 基本概念和方法入门推荐 ...