POJ 2513 Colored Sticks - from lanshui_Yang
题目大意:给定一捆木棒,每根木棒的每个端点涂有某种颜色。问:是否能将这些棒子首位项链,排成一条直线,且相邻两根棍子的连接处的颜色一样。
解题思路:此题是一道典型的判断欧拉回路或欧拉通路的问题,以木棍的端点颜色为顶点。方法是:先用并查集判断图是否连通,然后统计奇度顶点的个数sumj , 如果 sumj == 0 , 则图中存在欧拉回路 ;如果 sumj == 2 , 则图中存在欧拉通路 ; 如果 sumj > 2 ,则图中不存在欧拉通路。但是此题的关键是如何给端点颜色编号,一开始,我用map映射,结果TLE,所以,我就用到了Trie 树。
Ps:此题有坑!!当没有输入时,应当输出 Possible 。。
具体请看代码:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std ;
const int MAXN = 3e6;
int set[MAXN] ;
char s1[100] ;
char s2[100] ;
int cnt ; // 给端点编号
int d[MAXN] ; // 统计每个顶点的度
struct Tnode
{
int du ;
int xu ;
Tnode *next[26] ;
Tnode()
{
du = 0 ;
xu = 0 ;
memset(next , 0 ,sizeof(next)) ;
}
} ;
int find(int x) // 并查集
{
int r = x ;
while (r != set[r])
{
r = set[r] ;
}
return r ;
}
int inse(char * str , Tnode * root)
{
Tnode *p = root ;
while (*str)
{
int id = *str - 'a' ;
if(p -> next[id] == NULL)
{
p -> next[id] = new Tnode ;
}
++ str ;
p = p -> next[id] ;
}
if(p -> du == 0)
{
p -> xu = ++ cnt ; // 顶点颜色的编号从 1 开始
}
p -> du ++ ;
d[p -> xu] = p -> du ;
return p -> xu ;
}
int main()
{
memset(d , 0 , sizeof(d)) ;
int i ;
for(i = 1 ; i <= MAXN ; i ++)
{
set[i] = i ;
}
cnt = 0 ;
Tnode *root = new Tnode ;
while (scanf("%s%s" , s1 , s2) != EOF)
{
int x = inse(s1 , root) ;
int y = inse(s2 , root) ;
int tx = find(x) ;
int ty = find(y) ;
if(tx < ty)
{
set[ty] = tx ;
}
else
{
set[tx] = ty ;
}
}
int fz = 0 ; // 判断图的连通的分支个数
int sumj = 0 ; // 统计奇度顶点的个数
for(i = 1 ; i <= cnt ; i ++)
{
if(set[i] == i)
{
fz ++ ;
}
if(d[i] % 2 == 1)
{
sumj ++ ;
}
}
if(cnt == 0)
{
puts("Possible") ;
}
else if(fz == 1)
{
if(sumj > 2)
{
puts("Impossible") ;
}
else
{
puts("Possible") ;
}
}
else
{
puts("Impossible") ;
}
return 0 ;
}
POJ 2513 Colored Sticks - from lanshui_Yang的更多相关文章
- poj 2513 Colored Sticks(欧拉路径+并检查集合+特里)
题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色.如今给定每一个木棍两端的颜色.不同木棍之间拼接须要颜色同样的 端才干够.问最后是否能将N个木棍拼 ...
- [欧拉] poj 2513 Colored Sticks
主题链接: http://poj.org/problem? id=2513 Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Tota ...
- poj 2513 Colored Sticks trie树+欧拉图+并查集
点击打开链接 Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27955 Accepted ...
- POJ 2513 Colored Sticks
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 28036 Accepted: 7428 ...
- poj 2513 Colored Sticks (trie 树)
链接:poj 2513 题意:给定一些木棒.木棒两端都涂上颜色,不同木棒相接的一边必须是 同样的颜色.求能否将木棒首尾相接.连成一条直线. 分析:能够用欧拉路的思想来解,将木棒的每一端都看成一个结点 ...
- POJ 2513 Colored Sticks (欧拉回路 + 字典树 +并查集)
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27097 Accepted: 7175 ...
- poj 2513 Colored Sticks (trie树+并查集+欧拉路)
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 40043 Accepted: 10406 ...
- POJ 2513 - Colored Sticks - [欧拉路][图的连通性][字典树]
题目链接: http://poj.org/problem?id=2513 http://bailian.openjudge.cn/practice/2513?lang=en_US Time Limit ...
- poj 2513 Colored Sticks( 字典树哈希+ 欧拉回路 + 并查集)
题目:http://poj.org/problem?id=2513 参考博客:http://blog.csdn.net/lyy289065406/article/details/6647445 htt ...
随机推荐
- cogs 1008 贪婪大陆
/* 不要思维定视 盯着线段树维护l r 的ans不放 显然没法区间合并 换一种思路 如果打暴力的话 O(nm) 每次询问 扫一遍之前所有的修改 有交点则说明种数++ 接下来考虑如何优化 我们把每个区 ...
- 关于禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项
这个问题是我新装好sql2008r2以后,我把服务器上的数据库还原到本地,取代码里跟踪测试的时候,出现的这个问题. 然后我在网上找了之后在sql里直接新建查询执行如下语句: exec sp_confi ...
- 第二章 控件架构与自定义控件详解 + ListView使用技巧 + Scroll分析
1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWindow将DecorView作为整个应用窗口的根V ...
- String or binary data would be truncated
在使用Typed Dataset进行数据的插入时,会报这样的错:String or binary data would be truncated. 我碰到的原因是 数据库中字段的长度过段,插入时内容被 ...
- Entity Framework 新增实体,新增抽象实体
抽象实体不能new 抽象类:人,实体类:学生 人 p_人= new 学生(); 添加数据,学生和人都添加 抽象类可以提供一个抽象的方法,但是并没有实现,类似接口,但又不同于接口.子类继承父类时必须 ...
- UITableView出现卡顿如何处理
tableView的beginUpdate和endUpdate要比reloadData和reloadRowsAtIndexPaths好,因为beginUpdate和endUpdate会执行一个动画bl ...
- 【转】windows消息16进制对应表
来源:http://blog.sina.com.cn/s/blog_962250db0101d4mj.html windows mobile编程,无论使用eVC还是.net CF,都脱不开window ...
- (二)Knockout - ViewModel 的使用
计算属性 实际应用中,我们通常需要对数据进行加工 如: 指定日期格式,将数字相加... 等,此时可使用ko.computed().当数据发生改变是,KO会使用computed重新计算 DEMO1 更改 ...
- Delphi 串口打印机打印
一.硬件准备 打印机: 打印机必须具有串口,没有标配串口的打印机,必须购买串口卡,串口卡的型号请参考随机<操作手册>. 计算机: 计算机必须具有串口,计算机通常具有两个串口:COM1和CO ...
- ubuntu自动挂载windows分区和开机自动启动wallproxy
1. 自动挂载windows分区 ubuntu默认是要点一下相应的盘符才会挂载windows分区的. 今天发现了ubuntu下最简单的自动挂载windows分区的办法.... :) 参考如下方法:ht ...