记录编号 152803 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2012] 旅游 最终得分 100
用户昵称 Gravatarztx 是否通过 通过
代码语言 C++ 运行时间 0.905 s
提交时间 2015-03-15 17:05:04 内存使用 12.33 MiB
显示代码纯文本
  1. /****************************************\
  2. * Author : ztx
  3. * Title : [bzoj] 2657: [Zjoi2012]旅游(journey)
  4. * ALG :
  5. 画画图发现可以将每个三角形拆为三个三角形
  6. 他们代表相同的三角形,但是他们的关键字分别为三条边
  7. 这样的话按边排序就可以找到邻接关系并建树了
  8. 再对这棵树求最长链即可
  9. 暂时只想到了这么2B的解法
  10. * CMT :
  11. * Time :
  12. \****************************************/
  13.  
  14. #include <cstdio>
  15. #define Rep(i,l,r) for(i=l;i<=r;i++)
  16. #define Rev(i,l,r) for(i=r;i>=l;i--)
  17. int CH , NEG ;
  18. template <typename TP>
  19. inline void read(TP& ret) {
  20. ret = NEG = 0 ; while (CH=getchar() , CH<'!') ;
  21. if (CH == '-') NEG = true , CH = getchar() ;
  22. while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ;
  23. if (NEG) ret = -ret ;
  24. }
  25. template <typename TP>
  26. inline void reads(TP& ret) {
  27. while (ret=getchar() , ret<'!') ;
  28. while (CH=getchar() , CH>'!') ;
  29. }
  30.  
  31. #include <algorithm>
  32. #include <queue>
  33.  
  34. #define maxn 210010LL
  35. #define maxm 210010LL
  36.  
  37. struct FST { int to , next ; } e[maxm<<1] ;
  38. int star[maxn] = {0} , tote = 1 ;
  39. void AddEdge(int u , int v) { e[++tote].to = v ; e[tote].next = star[u] ; star[u] = tote ; }
  40.  
  41. struct TAG { int a , b , id ; } A[maxn*3] ;
  42. bool cmp(const TAG& a , const TAG& b) { return a.a==b.a?a.b<b.b:a.a<b.a; }
  43. bool operator - (TAG& a , TAG& b) { return (a.a==b.a&&a.b==b.b) ; }
  44.  
  45. int n ;
  46. std::queue<int>q ;
  47. int dep[maxn] = {0} ;
  48.  
  49. int main() {
  50. int i , a , b , c , p , tot = 0 ;
  51. #define READ
  52. #ifdef READ
  53. freopen("journey.in" ,"r",stdin ) ;
  54. freopen("journey.out","w",stdout) ;
  55. #endif
  56. read(n) ;
  57. Rep (i , 1 , n-2) {
  58. read(a) , read(b) , read(c) ;
  59. if (a>b) {if (a>c) std::swap(a,c) ;}
  60. else if (b>c) std::swap(b,c) ;
  61. /*
  62. "
  63. if (a>b) {if (a>c) std::swap(a,c) ;}
  64. else if (b>c) std::swap(b,c) ;
  65. "
  66. "
  67. if (a>b) if (a>c) std::swap(a,c) ;
  68. else if (b>c) std::swap(b,c) ;
  69. "
  70. 的区别 QAQ
  71. */
  72. if (a>b) std::swap(a,b) ;
  73. A[++tot] = (TAG){a,b,i} ;
  74. A[++tot] = (TAG){b,c,i} ;
  75. A[++tot] = (TAG){a,c,i} ;
  76. }
  77. std::sort(A+1 , A+tot+1 , cmp) ;
  78. Rep (i , 2 , tot) if (A[i]-A[i-1])
  79. AddEdge(A[i].id,A[i-1].id) ,
  80. AddEdge(A[i-1].id,A[i].id) ;
  81. q.push(1) ;
  82. dep[1] = -1 ;
  83. while (!q.empty()) {
  84. a = q.front() , q.pop() ;
  85. for (p=star[a];p;p=e[p].next)
  86. if (!dep[b=e[p].to]) {
  87. q.push(b) ; dep[b] = -1 ;
  88. }
  89. }
  90. q.push(a) ;
  91. dep[a] = 1 ;
  92. while (!q.empty()) {
  93. a = q.front() , q.pop() ;
  94. for (p=star[a];p;p=e[p].next)
  95. if (dep[b=e[p].to]==-1) {
  96. dep[b]=dep[a]+1 ;
  97. q.push(b) ;
  98. }
  99. }
  100. printf("%d\n", dep[a]) ;
  101. #ifdef READ
  102. fclose(stdin) ; fclose(stdout) ;
  103. #else
  104. getchar() ; getchar() ;
  105. #endif
  106. return 0 ;
  107. }