poj 2513 Colored Sticks 欧拉回路(字典树 +并查集)

此题中涉及三个小算法,这是一个无向图判断欧拉回路,

无向图存在欧拉回路的充要条件

一个无向图存在欧拉回路,当且仅当该图只存在0或2个奇数度数的顶点,且该图是连通图。

有向图存在欧拉回路的充要条件

一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。

判断度数很简单,当时没想明白怎么判断图示连通的,其实只要判断他们的父节点的个数,只要只有一个父节点,那么此图是连通的。

字典树分配一下他们的id就好了,还有卡住的一点就是零图是欧拉图。

还有我做了一个小小的剪芝,但是没有什么效果,只减少了30ms

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int cnt;
int par[500050];
char s1[20],s2[20];
int deg[500050];
struct node {
   int id;
   node  *next[26];
   node (){
     for(int i=0;i<26;i++)
        next[i]=NULL;
     id=0;
   }
 }*root;
 int Insert(char s[]){
     int len = strlen (s);
     node *p=root;
     for(int i=0;i<len;i++){
        if(p->next[s[i]-'a']==NULL)
            p->next[s[i]-'a']=new node();
            p=p->next[s[i]-'a'];
     }
     if(!p->id) return p->id=++cnt;
     else return p->id;
 }
 int findset(int x){
     if(x!=par[x])
        par[x]=findset(par[x]);
     return par[x];
 }
 void unite(int x,int y){
   int px=findset(x);
   int py=findset(y);
   if(px!=py){
    par[py]=px;
   }
 }
 bool con(){
     int k=0;
     for(int i=1;i<=cnt;i++){
        if(findset(i)==i) k++;
        if(k>1) return 0;//剪枝处
     }
     return 1;
 }
 bool oula(){
     int k=0;
      for(int i=1;i<=cnt;i++){
       if(deg[i]&1)  k++;
       if(k>2) return 0;//剪枝处
      }
      if(k==0||k==2)  return 1;
      return 0;
 }
 int main(){
     root = new node ();
     for(int i=0;i<500050;i++)
        par[i]=i;
        memset(deg,0,sizeof(deg));
        cnt=0;
     while(scanf("%s%s",s1,s2)!=EOF){
        int u=Insert(s1);
        int v=Insert(s2);
        deg[u]++;
        deg[v]++;
        unite(u,v);
     }
     if(cnt==0) puts("Possible");//当他们是零图的时候
     else {
        if(oula()&&con()) puts("Possible");
        else puts("Impossible");
     }

 }
时间: 2024-11-05 17:33:28

poj 2513 Colored Sticks 欧拉回路(字典树 +并查集)的相关文章

poj 2513 Colored Sticks(欧拉通路+并查集+字典树)

题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色,现在给定每个木棍两端的颜色,不同木棍之间拼接需要颜色相同的 端才可以,问最后能否将N个木棍拼接在一起. 解题思路:欧拉通路+并查集+字典树.欧拉通路,每个节点的统计度,度为奇数的点不能超过2个.并查集,判断节点 是否完全联通.字典树,映射颜色. #include <cstdio> #include <cstring> #include <string> #includ

poj 2513 Colored Sticks(欧拉回路 并查集 路径压缩 字典树)(困难)

Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 32545   Accepted: 8585 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a st

poj 2513 Colored Sticks 并查集 字典树 欧拉回路判断

点击打开链接题目链接 Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 30273   Accepted: 8002 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sti

POJ 2513 Colored Sticks(欧拉回路,字典树,并查集)

题意:给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 转:kuangbing 无向图存在欧拉路的充要条件为: ①     图是连通的: ②     所有节点的度为偶数,或者有且只有两个度为奇数的节点. 图的连通可以利用并查集去判断. 度数的统计比较容易. view code//第一次用指针写trie,本来是用二维数组,发现数组开不下,只好删删改改,改成指针 //做这道题,知道了欧拉回路判定,还有用指针写trie #include

POJ 2513 Colored Sticks(字典树+并查集连通性+欧拉回路)

题目地址:POJ 2513 刚开始没想到字典树,用的map函数一直TLE,由于上一次的签到题由于没想到字典树而卡了好长时间的深刻教训,于是过了不久就想起来用字典树了,(为什么是在TLE了5次之后..T^T)然后把map改成了字典树,然后就过了. 这题居然不知不觉的用上了欧拉回路..其实当时我是这样想的..因为相互接触的必须要相同,所以除了两端外,其他的都是两两相同的,所以除了两端的颜色外其他的的个数必须为偶数.然后两端的可能相同可能不相同,相同的话,说明所有的都是偶数个数了,不相同的话那就只有这

[欧拉回路] poj 2513 Colored Sticks

题目链接: http://poj.org/problem?id=2513 Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 30955   Accepted: 8159 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it

[ACM] POJ 2513 Colored Sticks (Trie树,欧拉通路,并查集)

Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 29736   Accepted: 7843 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a st

poj 2513 Colored Sticks(欧拉路径+并检查集合+特里)

题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色.如今给定每一个木棍两端的颜色.不同木棍之间拼接须要颜色同样的 端才干够.问最后是否能将N个木棍拼接在一起. 解题思路:欧拉通路+并查集+字典树. 欧拉通路,每一个节点的统计度,度为奇数的点不能超过2个.并查集,推断节点 是否全然联通. 字典树,映射颜色. #include <cstdio> #include <cstring> #include <string> #i

[欧拉] poj 2513 Colored Sticks

主题链接: http://poj.org/problem? id=2513 Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 30955   Accepted: 8159 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is i