PKU 2513 Colored Sticks(并查集+Trie树+欧拉路径(回路))
题目大意:
给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相连接的一端必须是同颜色的。
解题思路:
可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点,把木棒看成边,这样相同的颜色就是同一个节点
问题便转化为:给定一个图,是否存在“一笔画”经过涂中每一点,每条边一次。
这样就是求图中是否存在欧拉路Euler-Path。
关于度数的判断方法:
节点的度用颜色出现次数来统计,如样例中,蓝色blue出现三次(不管是出度还是入度),那么blue结点的度就为3,同样地,我们也可以通过输入得到其他全部结点的度,于是,我们有:
Magenta=2
Blue=3
Red=2
Violet=1
Cyan=2

用一个一维数组就能记录了,然后分别模2,就能判断颜色结点的奇偶性
只要奇度数的结点数的个数=1或>=3,即使图连通,也一定不存在欧拉路径
Trie树+并查集+欧拉路径
#include<cstdio>
#include<cstdlib>
#define maxn 500010
typedef struct Trie{
int pos;
struct Trie *next[];
}Trie,*trie;
trie root;
int k=,fa[maxn],d[maxn];
void Init(trie &p)
{
p=(trie)malloc(sizeof(Trie));
for(int i=;i<;i++) p->next[i]=NULL;
p->pos=;
}//建Trie树,返回单词编号
int Build(trie &p,char *s,int depth)
{
if(!s[depth]){
if(p->pos) return p->pos;
p->pos=++k;
fa[k]=k,d[k]=;//初始化祖先为自身,度数为0
return k;
}//q不能定义为全局变量
trie q=p->next[s[depth]-'a'];
if(q==NULL){
Init(q);
p->next[s[depth]-'a']=q;
}
return Build(q,s,depth+);
}
int Findset(int x)
{
if(fa[x]==x) return x;
return fa[x]=Findset(fa[x]);
}
void Union(int u,int v)
{
int x=Findset(u);
int y=Findset(v);
if(x!=y) fa[x]=y;
}
int main()
{
Init(root);
char s[],t[];
while(scanf("%s%s",s,t)!=EOF){
int x=Build(root,s,);
int y=Build(root,t,);
Union(x,y);
d[x]++,d[y]++;
}
int scc=,odd=;
for(int i=;i<=k;i++){
if(fa[i]==i) scc++;//不连通
if(d[i]&) odd++;//奇度节点
}
if(scc>||odd>) puts("Impossible");
else puts("Possible");
return ;
}
离散化+并查集+欧拉路径
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 500010
using namespace std;
int num[maxn],fa[maxn];
int idxc=,idxw=,cnt; struct Wood{
char left[],right[];
}wood[maxn/];
struct Node{
char col[];
bool operator<(const Node tmp)const{
if(strcmp(col,tmp.col)<=)
return true;
return false;
}
}node[maxn];
//二分查找颜色对应离散的编号
int Binary_Search(char *col){
int l=,r=cnt+;
while(r-l>){
int mid=(r+l)/;
if(strcmp(node[mid].col,col)<=) l=mid;
else r=mid;
}
return l;
}
int Findset(int x)
{
if(fa[x]!=x)
fa[x]=Findset(fa[x]);
return fa[x];
} int main()
{
char s1[],s2[];
while(scanf("%s%s",wood[idxw].left,wood[idxw].right)!=EOF){
strcpy(node[idxc++].col,wood[idxw].left);
strcpy(node[idxc++].col,wood[idxw].right);
idxw++;
}
sort(node+,node+idxc);
memset(num,,sizeof(num));
num[]++,cnt=;
for(int i=;i<idxc;i++){//进行离散处理,同时统计每种颜色出现的个数
if(strcmp(node[i].col,node[i-].col)!=){
strcpy(node[++cnt].col,node[i].col);
num[cnt]++;//颜色不同保留下来
}
else num[cnt]++;//颜色相同直接计数
}
for(int i=;i<maxn;i++) fa[i]=i;
for(int i=;i<idxw;i++){
int u=Binary_Search(wood[i].left);
int v=Binary_Search(wood[i].right);
int x=Findset(u),y=Findset(v);
if(x!=y) fa[x]=y;
}
int scc=,odd=;//cnt是节点编号,也是节点个数
for(int i=;i<=cnt;i++){
if(fa[i]==i) scc++;
if(num[i]%) odd++;
}
if(idxw==||(scc==&&(odd==||odd==))) printf("Possible\n");
else printf("Impossible\n");
}
PKU 2513 Colored Sticks(并查集+Trie树+欧拉路径(回路))的更多相关文章
- POJ 2513 Colored Sticks(欧拉回路,字典树,并查集)
题意:给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 无向图存在欧拉路的充要条件为: ① 图是连通的: ② 所有节 ...
- nyoj 230/poj 2513 彩色棒 并查集+字典树+欧拉回路
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=230 题意:给你许许多多的木棍,没条木棍两端有两种颜色,问你在将木棍相连时,接触的端点颜色 ...
- [欧拉] poj 2513 Colored Sticks
主题链接: http://poj.org/problem? id=2513 Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Tota ...
- poj 2513 Colored Sticks(欧拉路径+并检查集合+特里)
题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色.如今给定每一个木棍两端的颜色.不同木棍之间拼接须要颜色同样的 端才干够.问最后是否能将N个木棍拼 ...
- UVA1455 - Kingdom(并查集 + 线段树)
UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...
- 【bzoj5133】[CodePlus2017年12月]白金元首与独舞 并查集+矩阵树定理
题目描述 给定一个 $n\times m$ 的方格图,每个格子有 ↑.↓.←.→,表示从该格子能够走到相邻的哪个格子.有一些格子是空着的,需要填上四者之一,需要满足:最终的方格图中,从任意一个位置出发 ...
- 并查集&线段树&树状数组&排序二叉树
超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...
- 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)
题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...
- BZOJ 3910 并查集+线段树合并
思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...
随机推荐
- virtualbox pxe启动
在设置——系统中更改启动顺序,优先使用网路启动,如果你的网络环境支持PXE启动,就可以使用网络安装了. 转自: http://blog.csdn.net/huanghuibai/article/det ...
- HDU 1284 钱币兑换问题(全然背包:入门题)
HDU 1284 钱币兑换问题(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1284 题意: 在一个国家仅有1分,2分.3分硬币,将钱N ( ...
- ADT(Android Developer Tools)中配置SVN
1:打开adt-bundle-windows-x86\eclipse目录.新创建目录subclipse (注:adt-bundle-windows-x86 为我的eclipse目录名) 2: 打开Ec ...
- .Net CCNet C#6.0 自动化编译问题解决
一.问题描述 由于C#6.0一些新的语法特性,导致先前部署的CCNet持续集成平台出现问题,无论是手动还是命令行均不能编译. 二.解决方案 1.下载BuildTools_Full.exe,地址:h ...
- 码农深耕 - 说说IDisposable
概要 C#提供了方便的垃圾回收机制,使我们几乎不再需要为资源管理费心.可事实上,能被垃圾回收释放掉的只是托管资源,非托管资源还是需要我们手动释放.而为了实现这一目的,C#提供了 IDisposable ...
- 内存泄露,GC相关
内存泄露就是对象不在GC的掌控之内 下面对象会发生内存泄露现象: 1.没有引用的对象 2.虚,软,弱 引用对象 GC引用的对象指的是 1.JavaStack中引用的对象 2.方法区中静态引用指向的对象 ...
- Foundation框架中的NSNumber对象详解
到目前为止,我们所讨论过的所有数字数据类型,如int型.float型和long型都是Objective-C语言中的基本数据类型,也就是说,它们都不是对象.例如,不能向它们发送消息.然而,有时需要作为对 ...
- jquery对象转dom对象
jq取兄弟级的上移个元素 jquery对象: var a = $(this).prev("a"); console.log(a); 输出: 转dom对象: var a = $(th ...
- python线程池ThreadPoolExecutor用法
线程池concurrent.futures.ThreadPoolExecutor模板 import time from concurrent.futures import ThreadPoolExec ...
- javascript自动识别是否移动设备访问
代码 JavaScript | 复制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function is_pc(){ var os = new Array(& ...