POJ2513 【并查集+欧拉路径+trie树】
题目链接:http://poj.org/problem?id=2513
Colored Sticks
| Time Limit: 5000MS | Memory Limit: 128000K | |
| Total Submissions:40949 | Accepted: 10611 |
Description
Input
Output
#include<stdio.h>
#include<string.h>
#define mem(a, b) memset(a, b, sizeof(a))
const int MAXN = * + ;//最多MAXN种颜色 即最多MAXN种不同的点 char s1[], s2[];
int deg[MAXN];
int trie[MAXN][], cnt, tot;
int id[MAXN], pre[MAXN]; int insert(char s[])
{
int flag = ;
int len = strlen(s);
int root = ;
for(int i = ; i < len; i ++)
{
int id = s[i] - 'a';
if(!trie[root][id])
{
flag = ; //单词之前没出现过
trie[root][id] = ++ cnt;
}
root = trie[root][id];
}
if(!flag)
{
tot ++;
id[root] = tot;
return id[root];
}
else
return id[root];
} int find(int x)
{
if(pre[x] == x)
return x;
else
{
int root = find(pre[x]);
pre[x] = root;
return pre[x];
}
} int main()
{
for(int i = ; i <= MAXN + ; i ++)
pre[i] = i;
while(scanf("%s%s", s1, s2) != EOF)
{
int a = insert(s1), b = insert(s2);//返回的是颜色所对应的序号
deg[a] ++, deg[b] ++; //点的度数 判断是否存在欧拉路径
int x = find(a), y = find(b); //查找根节点
if(x != y)
pre[y] = x;
}
int flag = ;
for(int i = ; i < tot; i ++) //总共有tot个不同的点
if(find(i) != find(i + ))
{
flag = ;
break;
}
if(flag == )
printf("Impossible\n");
else
{
int xx = ;
for(int i = ; i <= tot; i ++)
if(deg[i] % )
xx ++;
if(xx == || xx == )
printf("Possible\n");
else
printf("Impossible\n");
}
return ;
}
POJ2513 【并查集+欧拉路径+trie树】的更多相关文章
- 【BZOJ2054】疯狂的馒头(并查集,线段树)
[BZOJ2054]疯狂的馒头(并查集,线段树) 题面 BZOJ 然而权限题,随便找个离线题库看看题吧. 题解 线段树就是个暴力,如果数据可以构造就能卡掉,然而不能构造,要不然复杂度瓶颈成为了读入了. ...
- POJ 2513 字典树+并查集+欧拉路径
Description: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 解题思路: 可以用图论中欧拉路的知识来解这道题,首先可以把木 ...
- 【并查集】【树】最近公共祖先LCA-Tarjan算法
最近公共祖先LCA 双链BT 如果每个结点都有一个指针指向它的父结点,于是我们可以从任何一个结点出发,得到一个到达树根结点的单向链表.因此这个问题转换为两个单向链表的第一个公共结点(先分别遍历两个链表 ...
- UVa 10129 (并查集 + 欧拉路径) Play on Words
题意: 有n个由小写字母的单词,要求判断是否存在某种排列使得相邻的两个单词,前一个单词末字母与后一个单词首字母相同. 分析: 将单词的两个字母看做节点,则一个单词可以看做一条有向边.那么题中所求的排列 ...
- POJ 1944 Fiber Communications (枚举 + 并查集 OR 线段树)
题意 在一个有N(1 ≤ N ≤ 1,000)个点环形图上有P(1 ≤ P ≤ 10,000)对点需要连接.连接只能连接环上相邻的点.问至少需要连接几条边. 思路 突破点在于最后的结果一定不是一个环! ...
- hdu 3172 Virtual Friends(并查集,字典树)
题意:人与人交友构成关系网,两个人交友,相当于两个朋友圈的合并,问每个出两人,他们目前所在的关系网中的人数. 分析:用并查集,其实就是求每个集合当前的人数.对于人名的处理用到了字典树. 注意:1.题目 ...
- ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)
Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的 ...
- hdu6200 mustedge mustedge mustedge (并查集+dfs序树状数组)
题意 给定一个n个点m条边无向图(n,m<=1e5) 支持两个操作 1.添加一条边 2.询问点u到点v的所有路径中必经边的条数 操作数<=1e5 分析 第一眼看起来像是要动态维护无向图的边 ...
- 2019牛客第八场多校 E_Explorer 可撤销并查集(栈)+线段树
目录 题意: 分析: @(2019牛客暑期多校训练营(第八场)E_Explorer) 题意: 链接 题目类似:CF366D,Gym101652T 本题给你\(n(100000)\)个点\(m(1000 ...
随机推荐
- CF1156E Special Segments of Permutation
思路:笛卡尔树?(好像并不一定要建出来,但是可以更好理解) 提交:2次 错因:没有判左右儿子是否为空来回溯导致它T了 题解: 建出笛卡尔树,考虑如何计算答案: 先预处理每一个值出现的位置 \(pos[ ...
- 006_linuxC++之_引用
1. 什么是“引用”?申明和使用“引用”要注意哪些问题? 答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同.申明一个引用的时候,切记要对其进行初始化.引用声明 ...
- 002_linux之点灯(汇编深度解析)
1. 开发板采用韦山东的开发板 2. 芯片CPU三星S3C2440A 3. 控制引脚:GPF4 4. linux操作系统 5. 芯片手册下载地址:https://eyun.ba ...
- P1169 [ZJOI2007]棋盘制作——悬线法
---恢复内容开始--- 给你一个矩阵,选出最大的棋盘,棋盘的要求是黑白相间(01不能相邻),求出最大的正方形和矩形棋盘的面积: 数据n,m<=2000; 这个一看就可能是n2DP,但是写不出. ...
- idea导入项目之后包位置报错
解决办法:
- sql文件导入老是失败
这是因为sql文件中的编码格式与库的格式不一致造成的,遇到这种问题先进入sql文件看看其编程格式是什么后再建立库的格式一般我们建立库都只选择utf-8下面的格式都没有选择
- springboot 出现 org.hibernate.LazyInitializationException: could not initialize proxy
org.hibernate.LazyInitializationException: could not initialize proxy [com.example.shop.dataobject.U ...
- AOP 底层实现原理
1.核心业务接口与实现 public interface IManager { void add(String item); } public class IManagerImpl implement ...
- hibernate-validator校验框架学习
1.引入jar包 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate ...
- 分享一个自己做的SpringMVC的PPT,由于比较忙只写了一些重要的部分