poj 2513 Colored Sticks 彩色棒

poj  2513  Colored Sticks

http://poj.org/problem?id=2513

题意:现在有几个木棒,每个木棒端点都着色,问:能否将它们排成一排,同时要满足相邻的的两端点颜色是一样的。

trie+并查集+欧拉通路

方法:要想排成一排,可以变向的理解为从一个图里找到一个欧拉通路(一定要想到);如果只是孤零零的一个个小棒,这道题很难实现。

首先:要先要对所有颜色进行编号,由于事先又不知道有几种颜色,有哪几种颜色。故有一个笨方法,用map<int,string>容器存出现过的颜色,每次在对一个颜色进行编号时要遍历map里的每一个颜色,没有的话添后面,有的话返回颜色所对应的编号。题目中提到颜色最多有500000中颜色,每次查找时最坏的情况是查找次数为500000,会超时。因此这里就要用到trie树,虽然每次也要寻找该颜色是否出现过,但是每次查找最坏情况只是该单词的长度(10),ok?

其次:该题木就可以简化顶点标有序号的一个图,要从中判断有否  欧拉通路:1.图是联通的(用并查集判断)2.图中顶点的度要么没有奇数,要么有2个奇数度顶点。

难点:能想到转化为图,找欧拉通路

trie树的另一个作用:编序号!!!!!

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <iostream>
  4 #include <algorithm>
  5 #include <cstdio>
  6 #include <cstring>
  7 #include <cmath>
  8 #include <stack>
  9 #include <queue>
 10 #include <functional>
 11 #include <vector>
 12 #include <map>
 13 using namespace std;
 14 #define M 0x0f0f0f0f
 15 #define min(a,b) (a>b?b:a)
 16 #define max(a,b) (a>b?a:b)
 17 int cnt=1;//单词的个数
 18 int father[500002];
 19 int v[500002];
 20 struct tree
 21 {
 22     struct tree *next[30];
 23     int ji;//标记该结点处是否构成单词,还代表该单词的编号
 24 };
 25 int insert_(struct tree *root,char *s)//通过trie树对每一种颜色进行编号
 26 {
 27     int i;
 28     if(*s==‘\0‘||root==NULL)
 29         return 0;
 30     struct tree *p=root;
 31     while(*s!=‘\0‘)
 32     {
 33         if(p->next[*s-‘a‘]==NULL)
 34         {
 35             struct tree *t=(struct tree *)malloc(sizeof(struct tree));
 36             for(i=0; i<30; i++)
 37             {
 38                 t->next[i]=NULL;
 39             }
 40             t->ji=0;
 41             p->next[*s-‘a‘]=t;
 42             p=t;
 43         }
 44         else
 45             p=p->next[*s-‘a‘];
 46         s++;
 47     }
 48     if(p->ji==0)
 49         p->ji=cnt++;
 50     return p->ji;
 51 }
 52
 53 //并查集,判断是否联通
 54 void inte()
 55 {
 56     for(int i=0; i<500003; i++)
 57         father[i]=i;
 58 }
 59
 60 int find_(int a)
 61 {
 62     if(father[a]==a)
 63         return a;
 64     return find_(father[a]);
 65 }
 66
 67 void unin(int a,int b)
 68 {
 69     int a1=find_(a);
 70     int b1=find_(b);
 71     if(a1!=b1)
 72         father[a1]=b1;
 73 }
 74
 75 int main()
 76 {
 77     int a1,b1;
 78     char a[13],b[13];
 79     int i;
 80     struct tree *root=(struct tree *)malloc(sizeof(struct tree));
 81     for(i=0; i<30; i++)
 82         root->next[i]=NULL;
 83     root->ji=0;
 84     memset(v,0,sizeof(v));
 85     inte();
 86     while(scanf("%s %s",a,b)!=EOF)
 87     {
 88         a1=insert_(root,a);
 89         b1=insert_(root,b);
 90         v[a1]++;
 91         v[b1]++;
 92         unin(a1,b1);
 93     }
 94     int mm=find_(1);
 95     int flag=0;
 96     int flag1=0;
 97     if(v[1]%2)
 98         flag1++;
 99     for(i=2; i<cnt; i++)
100     {
101         if(mm!=find_(i))
102             flag=1;
103         if(v[i]%2)
104         {
105             flag1++;
106         }
107     }
108
109     if(flag)//bu lian tong
110         printf("Impossible\n");
111     else if(flag1==0||flag1==2)//ke yibi hua
112         printf("Possible\n");
113     else
114         printf("Impossible\n");
115     return 0;
116 }

poj 2513 Colored Sticks 彩色棒

时间: 2024-10-21 13:50:15

poj 2513 Colored Sticks 彩色棒的相关文章

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

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

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: 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

[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 刚开始没想到字典树,用的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

[欧拉] 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

POJ 2513 Colored Sticks (Trie树+并查集+欧拉路)

Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 31490   Accepted: 8320 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