poj2513_欧拉通路+并查集+hashtrie 收藏
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
poj2513_欧拉通路+并查集
+hash/trie 收藏
这找了很多解题报告,都是用trie做的,有一些还干脆否定了hash,本人偏偏不信这个邪,用hash做。。。
hash代码:
view plaincopy to clipboardprint?
1.#include
2.#include
3.#include
ing namespace std;
5.const int maxn=500005;
6.int degree[maxn];
7.int p[maxn];
8.int find_p(int x)
9.{
10. while(x!=p[x])
11. x=p[x];
12. return x;
13.}
14.void union_p(int x,int y)
15.{
16. if(find_p(x)==0)
17. p[x]=x;
18. if(find_p(y)==0)
19. p[y]=y;
20. p[find_p(x)]=find_p(y);
21.}
22.int hash_index(char s[])
23.{
24. int hash=1;
25. int len=strlen(s);
26. for(int i=0;i 27. hash=(hash*29+s[i]-'a')%maxn; 28. return hash; 29.} 30.int main() 31.{ 32. // freopen("in","r",stdin); 33. char a[11],b[11]; 34. int i,j; 35. for(i=0;i 36. { 37. degree[i]=0; 38. p[i]=0; 39. } 40. int n1,n2; 41. while(scanf("%s%s",a,b)!=EOF) 42. { 43. n1=hash_index(a); 44. n2=hash_index(b); 45. degree[n1]++; 46. degree[n2]++; 47. union_p(n1,n2); 48. } 49. int sum=0; 50. for(i=1;i 51. { 52. if(degree[i]%2) 53. sum++; 54. if(sum>2) 55. { 56. printf("Impossible\n"); 57. return 0; 58. } 59. } 60. i=1; 61. while(i 62. i++; 63. int flag=find_p(i); 64. for(;i 65. { 66. int x=find_p(i); 67. if(x&&x!=flag) 68. { 69. printf("Impossible\n"); 70. return 0; 71. } 72. } 73. printf("Possible\n"); 74. return 0; 75.} 用trie树做: view plaincopy to clipboardprint? 1.#include 2.#include 3.#include ing namespace std; 5.const int maxn=500005; 6.int degree[maxn]; 7.int p[maxn]; 8.int num; 9.struct node 10.{ 11. int id; 12. node *next[26]; 13. node () 14. { 15. id=-1; 16. for(int i=0;i<26;i++) 17. next[i]=NULL; 18. } 19.}*root; 20.int find_p(int x) 21.{ 22. while(p[x]!=x) 23. x=p[x]; 24. return x; 25.} 26.void merge(int x,int y) 27.{ 28. p[find_p(x)]=find_p(y); 29.} 30.int insert(char s[]) 31.{ 32. int i,j; 33. node *p=root; 34. int len=strlen(s); 35. for(i=0;i 36. { 37. if(p->next[s[i]-'a']==NULL) 38. p->next[s[i]-'a']=new node; 39. p=p->next[s[i]-'a']; 40. } 41. if(p->id==-1) 42. p->id=num++;