poj2513 Colored Sticks —— 字典树 + 并查集 + 欧拉回路
题目链接:http://poj.org/problem?id=2513
题解:通过这题了解了字典树。用字典树存储颜色,并给颜色编上序号。这题为典型的欧拉回路问题:将每种颜色当成一个点。首先通过并查集判断是否为连通图,再检验是否符合欧拉回路的特点。不过题目有一点很奇怪,在并查集中,若图为连通,不是有且仅有一个点的fa[]等于它自己吗,即类似于根节点?为什么会出现有0个的情况,这一点搞不懂。
判断欧拉路是否存在的方法:
有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。
无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。
判断欧拉回路是否存在的方法:
有向图:图连通,所有的顶点出度=入度。
无向图:图连通,所有顶点都是偶数度。
一开始用C语言写,结果在传指针的时候,传的是指针的值,而不是指针的地址,所以并不能修改指针的值,故出错。
或者直接用C++的引用,简洁方便。但我还是更喜欢用C语言的传地址,因为这样更能理解其中的原理。
C语言和C++的代码都附上,区别不大。
代码如下:
C语言:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 500010 typedef struct node
{
struct node *next[];
int pos;
}Trie, *PT; int n,fa[MAXN],deg[MAXN]; int init(PT *p)
{
(*p) = (PT)malloc(sizeof(Trie));
(*p)->pos = ;
for(int i = ; i<; i++)
(*p)->next[i] = NULL;
} int trie(char *s, int k, PT *p)
{
if(!s[k])
{
if((*p)->pos) return (*p)->pos;
(*p)->pos = ++n;
fa[n] = n;
return (*p)->pos;
} else
{
if(!(*p)->next[s[k]-'a'])
init(&((*p)->next[s[k]-'a']));
return trie(s,k+,&((*p)->next[s[k]-'a']));
}
} int find(int a)
{
return (fa[a]==a)?a:find(fa[a]);
} void un(int x, int y)
{
x = find(x);
y = find(y);
if(x!=y)
fa[x] = y;
} int main()
{
char s1[], s2[];
int x,y,n1,n2;
PT p;
init(&p);
n1 = n2 = n = ;
memset(deg,,sizeof(deg));
while(scanf("%s%s",s1,s2)==)
{
x = trie(s1,,&p);
y = trie(s2,,&p);
un(x,y);
deg[x]++; deg[y]++;
} for(int i = ; i<=n; i++)
{
if(fa[i]==i) n1++;
if(deg[i]&) n2++;
} if(n1<= && n2<=)
puts("Possible");
else
puts("Impossible");
return ;
}
C++:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 500010 typedef struct node
{
struct node *next[];
int pos;
}Trie, *PT; int n,fa[MAXN],deg[MAXN]; int init(PT &p)
{
p = (PT)malloc(sizeof(Trie));
p->pos = ;
for(int i = ; i<; i++)
p->next[i] = NULL;
} int trie(char *s, int k, PT &p)
{
if(!s[k])
{
if(p->pos) return p->pos;
p->pos = ++n;
fa[n] = n;
return p->pos;
} else
{
if(!p->next[s[k]-'a'])
init(p->next[s[k]-'a']);
return trie(s,k+,p->next[s[k]-'a']);
}
} int find(int a)
{
return (fa[a]==a)?a:find(fa[a]);
} void un(int x, int y)
{
x = find(x);
y = find(y);
if(x!=y)
fa[x] = y;
} int main()
{
char s1[], s2[];
int x,y,n1,n2;
PT p;
init(p);
n1 = n2 = n = ;
memset(deg,,sizeof(deg));
while(scanf("%s%s",s1,s2)==)
{
x = trie(s1,,p);
y = trie(s2,,p);
un(x,y);
deg[x]++; deg[y]++;
} for(int i = ; i<=n; i++)
{
if(fa[i]==i) n1++;
if(deg[i]&) n2++;
} if(n1<= && n2<=)
puts("Possible");
else
puts("Impossible");
return ;
}
poj2513 Colored Sticks —— 字典树 + 并查集 + 欧拉回路的更多相关文章
- POJ2513:Colored Sticks(字典树+欧拉路径+并查集)
http://poj.org/problem?id=2513 Description You are given a bunch of wooden sticks. Each endpoint of ...
- poj 2513 Colored Sticks (trie树+并查集+欧拉路)
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 40043 Accepted: 10406 ...
- POJ2513——Colored Sticks(Trie树+欧拉回路+并查集)
Colored Sticks DescriptionYou are given a bunch of wooden sticks. Each endpoint of each stick is col ...
- Colored Sticks (字典树哈希+并查集+欧拉路)
Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27704 Accepted: 7336 Description You ...
- POJ-2513 Colored Sticks---欧拉回路+并查集+字典树
题目链接: https://vjudge.net/problem/POJ-2513 题目大意: 给一些木棍,两端都有颜色,只有两根对应的端点颜色相同才能相接,问能不能把它们接成一根木棍 解题思路: 题 ...
- Colored Sticks POJ - 2513 并查集+欧拉通路+字典树hash
题意:给出很多很多很多很多个棒子 左右各有颜色(给出的是单词) 相同颜色的可以接在一起,问是否存在一种 方法可以使得所以棒子连在一起 思路:就是一个判欧拉通路的题目,欧拉通路存在:没奇度顶点 或者 ...
- POJ 2513 Colored Sticks (欧拉回路 + 字典树 +并查集)
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27097 Accepted: 7175 ...
- POJ 2513 Colored Sticks(欧拉道路+字典树+并查集)
http://poj.org/problem?id=2513 题意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 思路: 题目很明 ...
- POJ2513Colored Sticks(欧拉通路)(字典树)(并查集)
Colored Sticks Time Limit: 5000MS Memory ...
随机推荐
- 洛谷——P1331 海战
P1331 海战 题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防 ...
- Codeforces Round #321 (Div. 2) Kefa and Dishes 状压+spfa
原题链接:http://codeforces.com/contest/580/problem/D 题意: 给你一些一个有向图,求不超过m步的情况下,能获得的最大权值和是多少,点不能重复走. 题解: 令 ...
- SVG动画实践篇-无中生有的线条动画
git: https://github.com/rainnaZR/svg-animations/tree/master/src/pages/step2/path 说明 这个动画实现的是线条动画,主要用 ...
- 邁向IT專家成功之路的三十則鐵律 鐵律二十五:IT人屈辱之道-十倍奉還
現代人普遍火氣都很大,與人爭論時只要有一點點感到屈辱,便會開始大聲反擊,甚至於暴力相向.至於企業中的人事相鬥,則是典型的來個明爭暗鬥,直到成為老闆眼中的紅人,在逐漸掌握了權力之後再來個內部大清洗,不久 ...
- 【前台 ajax】前台ajax请求,地址正确,但是报错不进入后台
前台ajax请求,地址正确,但是报错不进入后台 出现上述问题,可能的情况是 1.ajax用的post,而后台限定用get,或者所有的post请求都被拦截,所以不能正常进入并且报错403 @Reques ...
- 智能手机+DIY红外=万能遥控器
目前好像只有:三星S4.,努比亚大牛,华为荣耀3等几款新机才有红外遥控功能,那我们使用的手机没有这个功能怎么办?不要急我有办法呵呵,本次DIY材料好找又简单,大家都可以亲自试一试! DIY材料:红外二 ...
- 【层次查询】Hierarchical Queries之亲兄弟间的排序(ORDER SIBLINGS BY)
http://blog.itpub.net/519536/viewspace-624176 有关层次查询之前的文章参考如下. [层次查询]Hierarchical Queries之"树的遍历 ...
- Examples osgparticleshader例子学习
Examples osgparticleshader 粒子与shader的使用 参考文档 http://blog.csdn.net/csxiaoshui/article/details/234345 ...
- solaris用户与文件权限管理
此文章已于 20:45:28 2015/3/22 重新发布到 zhuxuekui3 solaris用户与文件权限管理1 类别 「网站分类」Oracle 一.用户与用户组管理 三种用户:超级用户. ...
- Audio原理图设计
1.DMIC 1)当双MIC时,通过MIC上的Selection PIN脚PULL U/D进行左右channel选择.