http://poj.org/problem?id=2513

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

思路 : 这个题的话就比较麻烦,不过倒也好理解,有并查集,树来保存字符串集合,用图论知识来解决就可以了,这个题如果把木棒看成一条边,木棒一端具有相同颜色的看成同一个点,因此可以转化成一个图中判断能否一笔画,就是给你一个无向图,让你判断是否存在欧拉路。而无向图中存在欧拉路的的条件有两个,一个是图要是联通的,二是所有节点的度为偶数度,或者奇数度节点为偶数个,其实就是两个。

至于欧拉图,欧拉路什么的我就不再赘述,看了一位大神的博客写的挺好的

http://www.cnblogs.com/buptLizer/archive/2012/04/15/2450297.html,大家不清楚的可以了解一下。

判断图联通的话用并查集,这个题一看就能看出来用并查集,至于用树来保存字符串集合,并不是太会,后来会神给讲了讲,就是在厚的白皮书第208页,有兴趣的可以看一看,还有一点,我代码中定义的maxn,一开始我开到110,结果MLE了,开到70也MLE,后来我玩心起来就去挨个试了一下,开到29,内存是59736,开到15,内存是23804,开到50的话内存就是108628了,好神奇的样子

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std ;
const int maxn = ;
const int maxm = ;
int bing[maxm],deg[maxm];
int ch[maxm][maxn] ;
int vis[maxm] ;
int cnt = ;
struct Trie
{
int sz ;//节点总数
void TTrie()//初始时只有一个根节点
{
sz = ;
memset(ch[],,sizeof(ch[])) ;
}
int idx(char c)
{
return c-'a' ; //字符c的编号
}
//插入字符串s,附加信息为v,注意v必须为非0,因为0代表“本节点不是单词节点”
int insert(char *s)
{
int u = ,n = strlen(s) ;
for(int i = ; i < n ; i++)
{
int c = idx(s[i]) ;
if(!ch[u][c])//节点不存在
{
memset(ch[sz],,sizeof(ch[sz]));
vis[sz] = ;//中间节点的附加信息为0
ch[u][c] = sz++ ;//新建节点
}
u = ch[u][c] ;//往下走
}
if(!vis[u])
vis[u] = ++cnt ;
return vis[u] ;
//vis[u] = v ; //字符串中的最后一个字符的附件信息为v
}
};
int find(int x)
{
if(x != bing[x])
bing[x] = find(bing[x]) ;
return bing[x] ;
}
void merge(int x,int y)
{
int fx = find(x) ;
int fy = find(y) ;
if(fx != fy)
bing[fx] = fy ;
}
void Init()
{
memset(deg,,sizeof(deg)) ;
for(int i = ; i <= maxm ; i++)
bing[i] = i ;
}
int main()
{
Trie trie ;
char a[],b[] ;
Init() ;
trie.TTrie() ;
while(~scanf("%s %s",a,b))
{
int id1 = trie.insert(a) ;
int id2 = trie.insert(b) ;
deg[id1]++ ;
deg[id2]++ ;
merge(id1,id2) ;
}
int ans = ;
for(int i = ; i <= cnt ;i++)
{
if(deg[i]% == )
ans++ ;
if(ans > ||find() != find(i))
{
printf("Impossible\n") ;
return ;
}
}
if(ans == )
printf("Impossible\n") ;
else
printf("Possible\n") ;
return ;
}

这个题还有很多牛人用的哈希做的,把链接粘过来,与君共勉

http://zhyu.me/acm/poj-2513.html

http://wenku.baidu.com/view/ca2af01dfc4ffe473368ab41.html

POJ2513Colored Sticks的更多相关文章

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

                                                             Colored Sticks Time Limit: 5000MS   Memory ...

  2. POJ2513-Colored Sticks

    /*思路:类似图论中“一笔画”问题,两根木棒的相连接的端点是一样的颜色,(a,b)--(b,c)--(c, d)....方法:trie树+并查集, 利用trie树建立字符串和某一个节点的映射,并将这些 ...

  3. poj2513Colored Sticks(无向图的欧拉回路)

    /* 题意:将两端涂有颜色的木棒连在一起,并且连接处的颜色相同! 思路:将每一个单词看成一个节点,建立节点之间的无向图!判断是否是欧拉回路或者是欧拉路 并查集判通 + 奇度节点个数等于2或者0 */ ...

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

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

  5. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  6. POJ 2653 Pick-up sticks (线段相交)

    题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...

  7. hduoj 1455 && uva 243 E - Sticks

    http://acm.hdu.edu.cn/showproblem.php?pid=1455 http://uva.onlinejudge.org/index.php?option=com_onlin ...

  8. POJ 2653 Pick-up sticks【线段相交】

    题意:n根木棍随意摆放在一个平面上,问放在最上面的木棍是哪些. 思路:线段相交,因为题目说最多有1000根在最上面.所以从后往前处理,直到木棍没了或者最上面的木棍的总数大于1000. #include ...

  9. POJ1065Wooden Sticks[DP LIS]

    Wooden Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21902   Accepted: 9353 De ...

随机推荐

  1. atoi 实现

    int atoi(const char *nptr); 把字符串转换成整型数.ASCII to integer 的缩写. 头文件: #include <stdlib.h> 参数nptr字符 ...

  2. NDK 通过java调用so文件

    首先我们来看so文件的来源 1. 自己写.c文件,然后生成so库 2. 引用别人的静态库,或者动态库来生成新的jni调用库. 我们先来看最简单的编写一个jni调用的so库,包含一个获取字符串的方法,通 ...

  3. [jQuery]我的封装笔记

    jQuery封装插件开发入门教程: http://www.awaimai.com/467.html 一.默认值和选项 jQuery.extend函数解释 extend(dest,src1,src2,s ...

  4. silverlight 生成二维码

    MainPage.xaml <Grid x:Name="LayoutRoot" Background="White"> <Border Bor ...

  5. Android布局揭秘

    前言 今天把对于布局的一些理解写下来,主要内容包括控件的属性的继承关系,控件与容器的属性的关系,以及各种类的属性的使用. 控件的属性种类 通常意义上讲,我们在对一个控件进行属性赋值的时候大体上有种类型 ...

  6. 如何判断PHP 是ts还是nts版的

    通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说应该是ts版,否则是nts版.

  7. CSS content内容生成技术以及应用

    content属性早在CSS2.1的时候就被引入了,可以使用:before以及:after伪元素生成内容.此特性目前已被大部分的浏览器支持:(Firefox 1.5+, Safari 3.5+, IE ...

  8. Python中Cookie的处理(二)cookielib库

    Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持. 该模块主要功能是提供可存储cookie的对象.使用此模块捕获cookie并 ...

  9. vim命令总结

    前言 本文翻译自:http://bencrowder.net/files/vim-fu/,参考了VIM中文帮助. Google翻译结果和实际操作结果,对原文的部分内容重新整理,删除和添加了 部分内容并 ...

  10. Linux内核目录

    linux目录结构 目录 1.树状目录结构图 2./目录 3./etc/目录 4./usr/目录 5./var/目录 6./proc/目录 7./dev/目录 该文章主要来自于网络进行整理. 目录结构 ...