poj2513_欧拉通路+并查集+hashtrie 收藏

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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++;

相关文档
最新文档