P2610 【[ZJOI2012]旅游】(dfs+树的直径)
楼下那篇题解说实话就是什么都没说,所以我再发一篇正常一点的。
楼下思路大体是正确的,但是之所以是说什么都没说,是因为他有两个比较致命的遗漏。首先是点,这里的点不是平时我们认为的点,如果多少接触过对偶图很容易看出来,这个题实际上要把每个三角形当作点,而把有临边的三角形连边,这样我们就可以大体上得到一棵树,至于怎么连这个边,使用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+树的直径)相关推荐
- [TJOI2012] 旅游(树的直径)
problem 写的什么jb题意!这个语文水平.... 洛谷的一堆题解看下来也没懂他们懂得题目大意,真是给我蚌埠住了 luogu评测链接 一句话题意:给定一个三角剖分,求任意两顶点穿过的最多三角形个数 ...
- 【leetcode-DFS】求根节点到叶节点数字之和/二叉树的最大路径和/路径总和/左叶子之和/树的直径
文章目录 求根节点到叶节点数字之和 深度优先搜索 广度优先搜索 二叉树的最大路径和 DFS 路径总和1 深度优先搜索 广度优先搜索 路径总和2 回溯法 广度优先搜索 左叶子之和 递归 DFS 树的直径 ...
- 图论--树的直径--DFS+树形DP模板
#include <iostream> #include <cstring> using namespace std;//maxv:源点能到的最远点,maxdis:最远点对应的 ...
- 【POJ - 3310】Caterpillar(并查集判树+树的直径求树脊椎(bfs记录路径)+dfs判支链)
题干: An undirected graph is called a caterpillar if it is connected, has no cycles, and there is a pa ...
- 求树的直径+并查集(bfs,dfs都可以)hdu4514
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...
- P1099 树的直径 DFS + 二分 / 尺取法
题意 传送门 P1099 树网的核 在任意一条直径上求出的最小偏心距都相等. 树上只有一条直径时显然成立.当树有多条直径,它们必定相交,且中点汇聚于同一处,那么中心附近树的各条直径的重叠部分是相同的, ...
- 树的直径算法(dfs)
1.什么是树的直径? 树的直径是一颗树中任意两点最长的距离 2.如何求树的直径? (1).任意找一点x,并求得树上任意一点到x的距离存到数组dist中 (2).找到距离x最长的点y并以点y为起点找到树 ...
- 算法提高——树上DP(树的直径)
文章目录 前言 一.什么是树的直径? 二.例题 三.树上DP 总结 前言 树的直径是图论里边非常高的考察点并且是入门树形dp的基础,竞赛的同学务必重视. 一.什么是树的直径? 树上最远两点(叶子结点) ...
- 小A与欧拉路(牛客-树的直径)
题解: 欧拉路:从图中任意一个点开始到图中任意一个点结束的路径,并且图中每条边只通过恰好一次 问你走完这树上所有的点最短路径是什么. 因为树是没有环的,所以你走到叶子结点的时候需要往回走,也就是再走一 ...
- 图论 ---- E. Pairs of Pairs(构造+无向图的dfs树的性质)
题目链接 题目大意: 题目解法: 首先我们先对这个图求一个dfs树dfs树dfs树,那么对dfs树dfs树dfs树求树的直径rrr如果⌈n2⌉≤r\lceil\frac{n}{2}\rceil\leq ...
最新文章
- IBM的“认知计算时代”
- [Java] HashMap 源码简要分析
- Java 基础入门随笔(1) JavaSE版——java语言三种技术架构
- 【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )
- 【学习笔记】SAP Fiori相关概念介绍
- [导入] 堆和栈的区别
- Python基础之window常见操作
- 通信基站c语言,[转]2015年数学建模C题–基于无线通信基站的室内三维定位问题...
- Ubuntu设置局域网Windows共享文件Samba
- 当一名程序员喝醉之后......
- eclipse中mybatis generator插件的安装与使用,实现自动生成代码
- Unity基础——刚体
- 基于Python构建土地利用转移矩阵及完成Markov预测
- 机器人搭建记录 HoshinoBot
- 程序员有话说,只务正业就够了吗?
- 线阵相机的线扫描速率的计算方法
- 09-Scrum过程-评审会(Review Meeting) 反思会(Retrospective Meeting)
- java连接qq邮箱_java如何使用ssl连接qq邮箱
- 用工具刺探主机通信和用系统ping命令有何区别
- linux老游戏,nSnake:老经典蛇游戏的克隆 - 在Linux终端播放
热门文章
- “一个人会不会一直穷下去”“先看看他关注的公众号”
- 用turtle实现动态汉诺塔
- 系统休眠(System Suspend)和设备中断处理
- HTML5之语义化标签
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)...
- linux中sed的用法
- label字符自动换行(转自网络)
- group by分组后获得每组中时间最大的那条记录
- Eclipse \ MyEclipse \Scala IDEA for Eclipse里如何将控制台console输出的过程记录全程保存到指定的文本文件(图文详解)...
- 基于centos7进行yum安装lnmp linux+nginx+php7.1+mysql5.7