题目链接:http://poj.org/problem?id=2513
题目大意:你有好多根棍子,这些棍子的两端分都别涂了一种颜色。请问你手中的这些棍子能否互相拼接,从而形成一条直线呢?
两根棍子只有在颜色相同的时候才能拼接。比如有两根棍子,第一根棍子的两端的颜色分别为blue green,第二根两端的颜色为blue red,那么他们就可以拼接成green blue blue red或者red blue blue green。
解题思路:跟之前写的POJ1386很像,都是首尾连通。但是这里需要用字典树(不能用map会超时)对这些颜色单词做处理分配编号,然后这些颜色就是一个个节点了,就可以建图了,然后判断一下是不是欧拉回(通)路即可。注意,这里的木棍可以反转,所以是无向图,还有输入的字符串数目可能为0要特判一下输出“Possible”。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define CLR(arr,val) memset(arr,val,sizeof(arr)) 6 using namespace std; 7 const int M=5e5+5; 8 9 struct Tire{ 10 Tire *next[26]; 11 int flag; 12 Tire(){ 13 for(int i=0;i<26;i++) 14 next[i]=NULL; 15 flag=-1; 16 } 17 }; 18 int degree[M],fa[M],color; 19 20 int Insert(char *str,Tire *&root){//要插入的字符串str 21 Tire *p=root; 22 for(int i=0;str[i]!='