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. Linux实现的IEEE 802.q VLAN

    本文转载自: http://blog.chinaunix.net/uid-20786208-id-4291059.html Technorati 标签: Linux VLAN   ---------- ...

  2. 8.samba server与client配置

    server端 1.安装samba:yum install -y samba\* 增加samba用户: useradd smb用户名               smbpasswd -a smb用户名 ...

  3. U-Boot--配置过程分析

    arm核:arm920t    2410 uboot版本:u-boot1.1.6 通过readme可以知道配置执行make smdk2410_config命令. 顶层Makefile : smdk24 ...

  4. IP进制站群原理

    百度搜索:“inurl:0×00”,会发现全是以八进制.十六进制形式显示的域名(如下图),当点击后,浏览器会自动将这些域名转换为十进制的ip.这种方式在黑帽圈目前挺火爆的,用于做长尾词排名,可以带来可 ...

  5. hbase meta表的结构

    下面看下hbase:meta 表的结构,hbase:meta表中,保存了每个表的region地址,还有一些其他信息,例如region的名字,HRegionInfo,服务器的信息.hbase:meta表 ...

  6. PHP页面跳转代码

    这年头,真是好记性不如烂笔头,学的还没有忘的快,刚才用到的页面跳转,却又记不清楚了,故特意整理了一下,用做以后参考.从一个网页跳转到另一个网页,是LAMP项目中最常用的技术之一,页面跳转可能是由于用户 ...

  7. WordPress 主题开发 - (三) 开发工具 待翻译

    Before we get started building any WordPress Theme, we’re going to need to get our development tools ...

  8. 常用ASCII 码对照表

    目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准 ...

  9. Java读取本地文件进行unicode解码

    工具使用: package test.opservice; import eh.util.MapValueUtil; import java.io.BufferedReader; import jav ...

  10. URL地址下载图片到本地

    package test.dao; import eh.base.dao.DoctorDAO; import eh.entity.base.Doctor; import junit.framework ...