今天模拟赛考了这道题,那就来水一篇题解吧。。。(话说提高组模拟赛考什么省选题啊??)


这道题要我们求一条线段最多能经过的三角形数量。

回想小学学过的奥数,老师告诉过我们这样一件事:`点无大小 线无粗细`。

既然如此,为什么不能把这条线段看成一条巨大的把三角形看成点呢?

那么本题的思路就出来了:我们把三角形看成点,然后建立一颗二叉树,在树上跑两边BFS求直径就可以了。

可是为什么我们一定能建成二叉树呢?

其实很好证明。

三角形只有三条边,那么最多能有一个父亲和两个儿子,所以是二叉树。

当然,这个东西不是特别重要。

重点是,我们接下来怎么建图?

这里我是这样解决的:

先把每一条边都存进一个map里面,然后map手写结构体统计边出现的次数。

然后遍历一遍map,把所有出现不止一次的边两端的三角形连在一起。

这个办法唯一的问题是常数比较大,写的丑就容易TLE(然而机房的lemon竟然可以AC!)。


AC代码如下:

955ms 38272kb

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. namespace StandardIO{
  6.  
  7. template<typename T>inline void read(T &x){
  8. x=;T f=;char c=getchar();
  9. for(;c<''||c>'';c=getchar())if(c=='-')f=-;
  10. for(;c>=''&&c<='';c=getchar())x=x*+c-'';
  11. x*=f;
  12. }
  13.  
  14. template<typename T>inline void write(T x){
  15. if(x<)putchar('-'),x*=-;
  16. if(x>=)write(x/);
  17. putchar(x%+'');
  18. }
  19.  
  20. }
  21.  
  22. using namespace StandardIO;
  23.  
  24. namespace Solve{
  25.  
  26. const int N=;
  27.  
  28. int n;
  29. struct __normal_pair{
  30. int first,second;
  31. inline bool operator < (const __normal_pair &x)const{
  32. if(first==x.first)return second<x.second;
  33. return first<x.first;
  34. }
  35. };
  36. struct __store_pair{
  37. int first,second,size;
  38. inline void push_back(int id){
  39. if(size++)second=id;
  40. else first=id;
  41. }
  42. };
  43. map<__normal_pair,__store_pair>edge;
  44. vector<int>graph[N];
  45. int dis[N],vis[N];
  46.  
  47. inline __normal_pair make_pair(int f,int s){
  48. return (__normal_pair){f,s};
  49. }
  50. inline void sor(int &a,int &b,int &c){
  51. if(a>b)swap(a,b);
  52. if(a>c)swap(a,c);
  53. if(b>c)swap(b,c);
  54. }
  55. inline int bfs(int s,int time){
  56. queue<int>q;
  57. dis[s]=,vis[s]=time;
  58. q.push(s);
  59. int final;
  60. while(!q.empty()){
  61. final=q.front();q.pop();
  62. for(register vector<int>::iterator i=graph[final].begin();i!=graph[final].end();++i){
  63. if(vis[*i]==time)continue;
  64. vis[*i]=time,dis[*i]=dis[final]+;
  65. q.push(*i);
  66. }
  67. }
  68. return final;
  69. }
  70.  
  71. inline void solve(){
  72. read(n);
  73. for(register int i=;i<=n-;++i){
  74. int p,q,r;
  75. read(p),read(q),read(r);
  76. sor(p,q,r);
  77. edge[make_pair(p,q)].push_back(i);
  78. edge[make_pair(q,r)].push_back(i);
  79. edge[make_pair(p,r)].push_back(i);
  80. }
  81. for(register map<__normal_pair,__store_pair>::iterator i=edge.begin();i!=edge.end();++i){
  82. if(i->second.size>){
  83. graph[i->second.first].push_back(i->second.second);
  84. graph[i->second.second].push_back(i->second.first);
  85. }
  86. }
  87. write(dis[bfs(bfs(,),)]+);
  88. }
  89.  
  90. }
  91.  
  92. using namespace Solve;
  93.  
  94. int main(){
  95. // freopen("triangulation9.in","r",stdin);
  96. // freopen("triangulation.out","w",stdout);
  97. solve();
  98. }

题解 P2610 【[ZJOI2012]旅游】的更多相关文章

  1. [洛谷P2610] [ZJOI2012]旅游

    洛谷题目链接:[ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个 ...

  2. 【题解】P2610 [ZJOI2012]旅游

    link 题意 T国的国土可以用一个凸N边形来表示,包含 \(N-2\) 个城市,每个城市都是顶点为 \(N\) 边形顶点的三角形,两人的旅游路线可以看做是连接N个顶点中不相邻两点的线段.问一路能经过 ...

  3. P2610 [ZJOI2012]旅游

    题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示,N个顶点表示N个入境/出 ...

  4. P2610 [ZJOI2012]旅游 树的直径

    这个题就是建图不太好建,但是我们一想,三角形貌似只能两两挨着,最后会变成一个二叉树,所以问题就变成求树的直径.建图用pair套map超级简单. 题干: 到了难得的暑假,为了庆祝小白在数学考试中取得的优 ...

  5. [ZJOI2012]旅游(树的直径)

    [ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示 ...

  6. BZOJ2657:[ZJOI2012]旅游——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2657 https://www.luogu.org/problemnew/show/P2610 到了难 ...

  7. P2610 【[ZJOI2012]旅游】(dfs+树的直径)

    楼下那篇题解说实话就是什么都没说,所以我再发一篇正常一点的. 楼下思路大体是正确的,但是之所以是说什么都没说,是因为他有两个比较致命的遗漏.首先是点,这里的点不是平时我们认为的点,如果多少接触过对偶图 ...

  8. BZOJ2657 [Zjoi2012]旅游(journey) 【树的直径】

    题目 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示,N个顶点表示N个入境/出境口 ...

  9. [bzoj2657][Zjoi2012]旅游 journey_ 对偶图_树形dp

    旅游 bzoj-2657 Zjoi-2012 题目大意:题目链接 注释:$1\le K\le 2\cdot 10^5$. 想法:这题... 感觉和上一个题的提示有些类似,就是题目生怕你不知道这是一道对 ...

随机推荐

  1. oc消息转发机制本质

    第一级转发:主体不变,动态添加对应函数: 第二级转发:函数不变,切换接收主体: 第三极转发:函数签名不变,主体和函数都有可能变化: 1.使用函数的动态添加技术: 2.使用的类似is-a swzzing ...

  2. 用jQuery设置多个css样式

    $("#show_one").css({"position":"fixed","top":"0px" ...

  3. Hadoop2.x 关于日志文件位置

    查看日志是发现Hadoop问题和解决Hadoop问题的第一步. 开始我不知道该去哪找日志,后来我发现在我启动节点的时候,有打印信息以及明确告诉了日志写在哪. [root@master hadoop]# ...

  4. docker-ce-17.03.2 离线安装RPM包

    [root@docker05 docker]# ll total 20796 -rw-r--r-- 1 root root    75032 Mar 26 23:52 audit-libs-pytho ...

  5. echars 在vue v-if 切换会 显示不出来或者显示出来但是不是百分百显示

    我也是百度看别人写的原因,然后自己总结,以后用到的时候来复制就可以将  v-if换成 v-show 第二不是百分百显示  可以用 this.$nextTick(function() { this.in ...

  6. XUtils3框架的基本用法(一)

    本文为作者原创,转载请指明出处: http://blog.csdn.net/a1002450926/article/details/50341173 今天给大家带来XUtils3的基本介绍.本文章的案 ...

  7. HDOJ1084 What Is Your Grade?

    What Is Your Grade? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  8. 38.angular的scope作用域

    转自:https://www.cnblogs.com/best/tag/Angular/ 1. Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带. S ...

  9. POJ 1631 nlogn求LIS

    方法一: 二分 我们可以知道 最长上升子序列的 最后一个数的值是随序列的长度而递增的 (呃呃呃 意会意会) 然后我们就可以二分找值了(并更新) //By SiriusRen #include < ...

  10. Servlet设置Cookie无效

    项目中保存用户信息用到了Cookie,之前没有太注意,今天怎么设置Cookie都无效,断点跟了无数遍,都没有找出问题所在,明明发送Cookie的代码都有执行,可是愣是找不到Cookie发送到哪里去了, ...