楼下那篇题解说实话就是什么都没说,所以我再发一篇正常一点的。

楼下思路大体是正确的,但是之所以是说什么都没说,是因为他有两个比较致命的遗漏。首先是点,这里的点不是平时我们认为的点,如果多少接触过对偶图很容易看出来,这个题实际上要把每个三角形当作点,而把有临边的三角形连边,这样我们就可以大体上得到一棵树,至于怎么连这个边,使用map和pair进行操作,具体说来很麻烦,可以上网某度以下。

建完图了之后,不难看出,我们要的结果就是建出来的这个树的最长链,然后就是找到一个最长链的端点的问题。由于这是一棵树,所以我们可以通过dfs或bfs求出其中的一个端点,然后从这个端点再来一次,求出的最大深度就是我们要的答案。由于这个题的数据限制,所以虽然这么建完图之后spfa绝对不慢,可是还是会T2~3个点,虽然你想A掉可以开O2优化,但是还是希望用搜索搜索出来。还有一个,不要cin,这个必T无疑,除非你开O2.。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<iomanip>
#include<map>
#define re register
#define ll long long
using namespace std;
struct po
{int nxt,to,dis;
};
map<pair<int,int>,int> m;
po edge[4000001];
int q[1000001],head[1000001],dis[300001],b[300001],temp[400001][3];
int n,s,t,r,st,to,ans,maxx,num;
inline int read()
{int x=0,c=1;char ch=' ';while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();while(ch=='-')c*=-1,ch=getchar();while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*c;
}
inline void add_edge(int from,int to,int dis)
{edge[++num].nxt=head[from];edge[num].to=to;edge[num].dis=dis;head[from]=num;
}
inline void finish(int id,int x,int y)
{int s=m[make_pair(x,y)];if(s){add_edge(s,id,1);add_edge(id,s,1);m.erase(m.find(make_pair(x,y)));}elsem[make_pair(x,y)]=id;
}
inline void spfa(int x)
{memset(dis,127,sizeof(dis));memset(b,0,sizeof(b));int front=0,tail=1;dis[x]=0;q[tail]=x;b[x]=1;while(front<tail){int now=q[++front];b[now]=0;for(re int i=head[now];i;i=edge[i].nxt){int u=edge[i].to;if(dis[u]>edge[i].dis+dis[now]){dis[u]=edge[i].dis+dis[now];if(!b[u]){b[u]=1;q[++tail]=u;}}}}
}
inline void bfs(int x)
{memset(b,0,sizeof(b));int front=0,tail=1;temp[tail][1]=x;temp[tail][2]=1;b[x]=1;while(front<tail){int now=temp[++front][1];int dep=temp[front][2];if(dep>maxx){st=now;maxx=dep;}for(re int i=head[now];i;i=edge[i].nxt){int u=edge[i].to;if(!b[u]){b[u]=1;temp[++tail][1]=u;temp[tail][2]=dep+1;}}}
}
int main()
{n=read();for(re int i=1;i<=n-2;i++){s=read();t=read();r=read();if(s>t)swap(s,t);if(s>r)swap(s,r);if(t>r)swap(t,r);finish(i,s,t);finish(i,s,r);finish(i,t,r);}bfs(1);maxx=0;bfs(st);cout<<maxx;
}

转载于:https://www.cnblogs.com/victorique/p/8426770.html

P2610 【[ZJOI2012]旅游】(dfs+树的直径)相关推荐

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

    problem 写的什么jb题意!这个语文水平.... 洛谷的一堆题解看下来也没懂他们懂得题目大意,真是给我蚌埠住了 luogu评测链接 一句话题意:给定一个三角剖分,求任意两顶点穿过的最多三角形个数 ...

  2. 【leetcode-DFS】求根节点到叶节点数字之和/二叉树的最大路径和/路径总和/左叶子之和/树的直径

    文章目录 求根节点到叶节点数字之和 深度优先搜索 广度优先搜索 二叉树的最大路径和 DFS 路径总和1 深度优先搜索 广度优先搜索 路径总和2 回溯法 广度优先搜索 左叶子之和 递归 DFS 树的直径 ...

  3. 图论--树的直径--DFS+树形DP模板

    #include <iostream> #include <cstring> using namespace std;//maxv:源点能到的最远点,maxdis:最远点对应的 ...

  4. 【POJ - 3310】Caterpillar(并查集判树+树的直径求树脊椎(bfs记录路径)+dfs判支链)

    题干: An undirected graph is called a caterpillar if it is connected, has no cycles, and there is a pa ...

  5. 求树的直径+并查集(bfs,dfs都可以)hdu4514

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...

  6. P1099 树的直径 DFS + 二分 / 尺取法

    题意 传送门 P1099 树网的核 在任意一条直径上求出的最小偏心距都相等. 树上只有一条直径时显然成立.当树有多条直径,它们必定相交,且中点汇聚于同一处,那么中心附近树的各条直径的重叠部分是相同的, ...

  7. 树的直径算法(dfs)

    1.什么是树的直径? 树的直径是一颗树中任意两点最长的距离 2.如何求树的直径? (1).任意找一点x,并求得树上任意一点到x的距离存到数组dist中 (2).找到距离x最长的点y并以点y为起点找到树 ...

  8. 算法提高——树上DP(树的直径)

    文章目录 前言 一.什么是树的直径? 二.例题 三.树上DP 总结 前言 树的直径是图论里边非常高的考察点并且是入门树形dp的基础,竞赛的同学务必重视. 一.什么是树的直径? 树上最远两点(叶子结点) ...

  9. 小A与欧拉路(牛客-树的直径)

    题解: 欧拉路:从图中任意一个点开始到图中任意一个点结束的路径,并且图中每条边只通过恰好一次 问你走完这树上所有的点最短路径是什么. 因为树是没有环的,所以你走到叶子结点的时候需要往回走,也就是再走一 ...

  10. 图论 ---- E. Pairs of Pairs(构造+无向图的dfs树的性质)

    题目链接 题目大意: 题目解法: 首先我们先对这个图求一个dfs树dfs树dfs树,那么对dfs树dfs树dfs树求树的直径rrr如果⌈n2⌉≤r\lceil\frac{n}{2}\rceil\leq ...

最新文章

  1. IBM的“认知计算时代”
  2. [Java] HashMap 源码简要分析
  3. Java 基础入门随笔(1) JavaSE版——java语言三种技术架构
  4. 【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )
  5. 【学习笔记】SAP Fiori相关概念介绍
  6. [导入] 堆和栈的区别
  7. Python基础之window常见操作
  8. 通信基站c语言,[转]2015年数学建模C题–基于无线通信基站的室内三维定位问题...
  9. Ubuntu设置局域网Windows共享文件Samba
  10. 当一名程序员喝醉之后......
  11. eclipse中mybatis generator插件的安装与使用,实现自动生成代码
  12. Unity基础——刚体
  13. 基于Python构建土地利用转移矩阵及完成Markov预测
  14. 机器人搭建记录 HoshinoBot
  15. 程序员有话说,只务正业就够了吗?
  16. 线阵相机的线扫描速率的计算方法
  17. 09-Scrum过程-评审会(Review Meeting) 反思会(Retrospective Meeting)
  18. java连接qq邮箱_java如何使用ssl连接qq邮箱
  19. 用工具刺探主机通信和用系统ping命令有何区别
  20. linux老游戏,nSnake:老经典蛇游戏的克隆 - 在Linux终端播放

热门文章

  1. “一个人会不会一直穷下去”“先看看他关注的公众号”
  2. 用turtle实现动态汉诺塔
  3. 系统休眠(System Suspend)和设备中断处理
  4. HTML5之语义化标签
  5. android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)...
  6. linux中sed的用法
  7. label字符自动换行(转自网络)
  8. group by分组后获得每组中时间最大的那条记录
  9. Eclipse \ MyEclipse \Scala IDEA for Eclipse里如何将控制台console输出的过程记录全程保存到指定的文本文件(图文详解)...
  10. 基于centos7进行yum安装lnmp linux+nginx+php7.1+mysql5.7