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. 【OSG细节实现】节点围绕位于axisPos平行于axis的轴进行旋转

    //绕着与axis平行的任意轴旋转 void rotate(const std::string& name, float angle, osg::Vec3 axisPos, osg::Vec3 ...

  2. UILabel常用属性

    [super viewDidLoad]; // 实例化UILabel并指定其边框 UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0 ...

  3. 孤岛能源安卓游戏android源码

    孤岛能源是一个以孤岛为背景的模拟动作游戏,游戏中你的角色是 Android 机器人,目的是找到该岛上充满能量的能源造福人类.游戏中,你可以选择按键操作,也可以选择触摸操作.希望你能顺利完成任务.   ...

  4. WCF 服务与终结点(四)

    服务 服务是一组公开功能的集合. 服务内部包含了如语言.技术.版本与框架等概念,服务之间的交互只允许使用规定的通信模式 外界客户端并不知道服务内部的实现细节,所以WCF服务通常通过元数据的方式描述可用 ...

  5. RUP(Rational Unified Process)统一软件过程概述

    RUP是Rational公司三位杰出的软件工程大师Grady Booch,Ivar Jacobson,James Rumbaugh提出的一个软件工程过程方法.软件开发过程是将一个用户需求转化为软件系统 ...

  6. Linux下iptables拦截Nginx的问题

    环境:CentOS 6.4 X64,Nginx 1.5.3 问题:配置好Nginx后,加入了“iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT” ...

  7. this.IsMounted() is not a function

    I'm trying to build a simple React App. It retrieves data from an ajax call and renders it to the pa ...

  8. 如何重建Octopress本地环境

    # 安装rvm, ruby, bundler 略 # 克隆octopress $ git clone git://github.com/imathis/octopress.git octopress ...

  9. XAML 概述二

    通过上一节我们已经对XAML有了一定的了解,这一节我们来系统的学习一下XAML. 一. 简单属性与类型转换器,属性元素: 我们已经知道 XAML是一种声明性的语言,并且XAML解析器会为每个标签创建一 ...

  10. eclipse增加浏览器chrome

    1.安装完了google chrome游览器后,如何让eclipse直接用chrome打开jsp 2.添加到eclipse环境中即可, Window(菜单) -- preferences 增加成功后, ...