题目

传送门:QWQ

分析

在任意两个不相邻的点连一条线,求这条线能穿过几个三角形。

建图比较讲究(详见代码)

求树的直径。

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=;
struct Node{
int x,y,id;
}E[maxn];
int cmp(Node a,Node b){ return a.x<b.x||(a.x==b.x&&a.y<b.y); }
struct Edge{
int u,v,dis;
};
vector<int> G[maxn];
int inq[maxn],d[maxn],n;
void Add(int u,int v){
G[u].push_back(v); G[v].push_back(u);
}
queue<int> que;
int spfa(int s){
memset(d,-,sizeof(d));
memset(inq,,sizeof(inq));
d[s]=;
que.push(s); inq[s]=;
while(!que.empty()){
int u=que.front(); que.pop();
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(d[v]<d[u]+){
d[v]=d[u]+;
if(!inq[v]){ que.push(v); inq[v]=; }
}
}
}
int ans=;
for(int i=;i<=n;i++) ans=max(ans,d[i]);
return ans;
}
inline int in(){
int x = , f = ; char ch = getchar();
while (ch < '' || ch > ''){if (ch == '-')f = -;ch = getchar();}
while (ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
}
int main(){
scanf("%d",&n);
int a,b,c,cnt=;
for(int i=;i<n-;i++){
a=in();b=in();c=in();
if(a>b) swap(a,b); if(b>c) swap(b,c); if(a>b) swap(a,b);
E[++cnt].x=a;E[cnt].y=b;E[cnt].id=i;
E[++cnt].x=a;E[cnt].y=c;E[cnt].id=i;
E[++cnt].x=b;E[cnt].y=c;E[cnt].id=i;
}
sort(E+,E++cnt,cmp);
for(int i=;i<=cnt;i++){
if(E[i].x==E[i-].x&&E[i].y==E[i-].y){
Add(E[i].id,E[i-].id);
}
}
int ans=,num;
spfa();
for(int i=;i<=n;i++){
if(ans<d[i]){ ans=d[i]; num=i; }
}
printf("%d\n",spfa(num));
return ;
}

【BZOJ】2657: [Zjoi2012]旅游(journey)(树的直径)的更多相关文章

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

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

  2. [bzoj] 2657 ZJOI2012 旅游 || bfs

    原题 题意: 一个多边形,三角剖分,求一条对角线最多能经过多少三角形 题解: 因为不涉及坐标之类的,所以根几何肯定一点关系都没有. 我们会发现,对于有共边的两个三角形,可以被同一条线穿过,而这就相当于 ...

  3. [ZJOI2012]旅游 对偶图 树的直径

    Code: // luogu-judger-enable-o2 #include<cstdio> #include<iostream> #include<algorith ...

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

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

  5. bzoj 2282 [Sdoi2011]消防(树的直径,二分)

    Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家 ...

  6. bzoj2657: [Zjoi2012]旅游(journey)

    求树的直径 真是太神辣 #include<cstdio> #include<cstring> #include<cstdlib> #include<algor ...

  7. bzoj 1912 : [Apio2010]patrol 巡逻 树的直径

    题目链接 如果k==1, 显然就是直径. k==2的时候, 把直径的边权变为-1, 然后在求一次直径. 变为-1是因为如果在走一次这条边, 答案会增加1. 学到了新的求直径的方法... #includ ...

  8. BZOJ 1509 逃学的小孩(树的直径)

    题意:从树上任找三点u,v,w.使得dis(u,v)+min(dis(u,w),dis(v,w))最大. 有一个结论u,v必是树上直径的两端点. 剩下的枚举w就行了. 具体不会证... # inclu ...

  9. BZOJ2657: [Zjoi2012]旅游(journey) (树形DP)

    题意:一个三角划分的凸多边形 画一条对角线 穿过最多的三角形 题解:把每一个三角形看作一个点 如果某条边是两个三角形的公共边 那么就把这两个三角形连边 然后问题就转化为求树上的最长链了 就当求个直径就 ...

随机推荐

  1. iOS中数组遍历的方法及比较

    数组遍历是编码中很常见的一种需求,我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 因为ios是兼容C语言的,所以c语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的系 ...

  2. DataFrame数据批量做线性回归

    我们通常用pandas读取csv文件为DataFrame数据格式,如下图,是部分县2001年到2009年的某种作物的产量数据.我们希望求得9年的增长趋势,即求一个一元线性回归模型的斜率,这个时候便可以 ...

  3. learn go passing variable-length arguments

    package main // 参考文档: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.3.md im ...

  4. 【排序】快速排序,C++实现

    原创博文,转载请注明出处! 本文代码的github地址 # 基本思想 ”快速排序“是对”冒泡排序“的改进. 基本原理:基于分治法,在待排线性表中取一个元素pivot作为枢轴值,通过一趟排序将待排线性表 ...

  5. JAVA多线程----用--进阶--》网络编程2

    import java.io.*; import java.net.*; /** * 服务器端逻辑线程 */ public class LogicThread extends Thread { Soc ...

  6. absolute的left和right的妙用

    之前做了一个自定义鼠标右键的布局,做的过程中遇到了一个很有趣的问题,之前一直没有注意到. 目标样式如下: 期初并不知道文字内容需要随机,所以写的时候写“死”了. 所有的内容都是按照设计的四个文字走的, ...

  7. Python:版本升级(Mac OS X)

    Mac OS X 10.8及以后的版本都预装了Python 2.7,但是在Mac上(Unix-like OS)上修改Python的版本并不如Windows方便.这篇文章的目标是要将Mac自带的Pyth ...

  8. Java并发--volatile详情

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  9. CA数字加密解密Demo

    package aisin.text;    import com.google.common.collect.Maps;  import sun.misc.BASE64Decoder;  impor ...

  10. iOS开发之html解析

    使用XPath解析html 可以从此处https://github.com/topfunky/hpple下载工程,将TFHpple.h,TFHpple.m,TFHppleElement.h,TFHpp ...