[洛谷P2610] [ZJOI2012]旅游
洛谷题目链接:[ZJOI2012]旅游
题目描述
到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~
经过一番抉择,两人决定将T国作为他们的目的地。T国的国土可以用一个凸N边形来表示,N个顶点表示N个入境/出境口。T国包含N-2个城市,每个城市都是顶点均为N边形顶点的三角形(换而言之,[b]城市组成了关于T国的一个三角剖分[/b])。[b]两人的旅游路线可以看做是连接N个顶点中不相邻两点的线段[/b]。
为了能够买到最好的纪念品,小白希望旅游路线上经过的城市尽量多。作为小蓝的好友,你能帮帮小蓝吗?
输入输出格式
输入格式:
每个输入文件中仅包含一个测试数据。
第一行包含两个由空格隔开的正整数N,N的含义如题目所述。
接下来有N-2行,每行包含三个整数 p,q,r,表示该城市三角形的三个顶点的编号(T国的N个顶点按顺时间方向从1至n编号)。
输出格式:
输出文件共包含1行,表示最多经过的城市数目。([b]一个城市被当做经过当且仅当其与线路有至少两个公共点[/b])
输入输出样例
输入样例#1:
6
1 2 4
2 3 4
1 4 5
1 5 6
输出样例#1:
4
说明
对于20%的数据, n<=2000
对于100%的数据, 4<=n<=200000
一句话题意: 给出一个 奇奇怪怪的(??) 多边形,其中每\(3\)条边围成一个城市,每两个相连的城市中有一条边,问从任意一个城市出发不重复经过某个城市最多能经过多少个城市.
题解: 首先对于这种奇奇怪怪的题目,我们需要将它转化模型.很显然这个连通关系可以将它转化成一个图论问题.对于这个建边,有一点小技巧,比如我们发现一条边只会连通两个城市,并且一条边一定是由多边形上的两个顶点确定的.所以我们可以将一条边的两个顶点的存入一个结构体内,并用\(map\)记录第一次与这条边接触的城市是哪一个.这样如果遍历到一个有值的边,就可以直接建边了.
然后我们需要思考这个建出来的图都有些什么性质.一个城市是一个三角形,那么显然它最多与三个城市连边,并且在边界上的城市是不会有三个城市与它相连的.并且在图中不会存在环,也就是两个三角形不可能有超过一条边的公共边.
那么知道这些性质了,我们就会发现它是一棵树,并且如果以边界为根的话,它还是一颗二叉树.
在树上找一条最长的路径,显然就是求树的直径,直接跑一遍\(dfs\)求出直径就可以了.
#include<bits/stdc++.h>
using namespace std;
const int N = 200000+5;
int n, ecnt = 0, last[N], ans = 0, f[N];
struct edge{
int to, nex, w;
}e[N*2];
struct line{
int x, y;
bool operator < (const line &a) const{
return x == a.x ? y < a.y : x < a.x;
}
};
map <line, int> vis;
void add(int x, int y, int z){
e[++ecnt].to = y, e[ecnt].w = z, e[ecnt].nex = last[x], last[x] = ecnt;
}
void dfs(int x, int fa){
for(int to, i=last[x];i;i=e[i].nex){
to = e[i].to; if(to == fa) continue;
dfs(to, x);
if(ans < f[x]+f[to]+e[i].w) ans = f[x]+f[to]+e[i].w;
if(f[x] < f[to]+e[i].w) f[x] = f[to]+e[i].w;
}
}
int main(){
ios::sync_with_stdio(false);
int x, y, z; cin >> n;
for(int i=1;i<=n-2;i++){
cin >> x >> y >> z;
if(x > y) swap(x, y); if(y > z) swap(y, z); if(x > y) swap(x, y);
if(vis[(line){ x, y }]) add(i, vis[(line){ x, y }], 1), add(vis[(line){ x, y }], i, 1);
else vis[(line){ x, y }] = i;
if(vis[(line){ y, z }]) add(i, vis[(line){ y, z }], 1), add(vis[(line){ y, z }], i, 1);
else vis[(line){ y, z }] = i;
if(vis[(line){ x, z }]) add(i, vis[(line){ x, z }], 1), add(vis[(line){ x, z }], i, 1);
else vis[(line){ x, z }] = i;
}
dfs(1, -1);
cout << ans+1 << endl;
return 0;
}
[洛谷P2610] [ZJOI2012]旅游的更多相关文章
- [洛谷P2597] [ZJOI2012]灾难
洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...
- 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告
P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ...
- P2610 [ZJOI2012]旅游
题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示,N个顶点表示N个入境/出 ...
- 洛谷 P2096 最佳旅游线路
某旅游区的街道成网格状.其中东西向的街道都是旅游街,南北向的街道都是林阴道.由于游客众多,旅游街被规定为单行道,游客在旅游街上只能从西向东走,在林阴道上则既可从南向北走,也可以从北向南走. 阿龙想到这 ...
- 洛谷 P2609 [ZJOI2012]数列 解题报告
P2609 [ZJOI2012]数列 题目描述 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: A(0)=0 A(1)=1 A(2i)=A(i) (对于任意 i>0 ...
- 洛谷 P2597 [ZJOI2012]灾难 解题报告
P2597 [ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发 ...
- 洛谷 P2173 [ZJOI2012]网络 解题报告
P2173 [ZJOI2012]网络 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环, ...
- P2610 [ZJOI2012]旅游 树的直径
这个题就是建图不太好建,但是我们一想,三角形貌似只能两两挨着,最后会变成一个二叉树,所以问题就变成求树的直径.建图用pair套map超级简单. 题干: 到了难得的暑假,为了庆祝小白在数学考试中取得的优 ...
- 【题解】P2610 [ZJOI2012]旅游
link 题意 T国的国土可以用一个凸N边形来表示,包含 \(N-2\) 个城市,每个城市都是顶点为 \(N\) 边形顶点的三角形,两人的旅游路线可以看做是连接N个顶点中不相邻两点的线段.问一路能经过 ...
随机推荐
- 基础数据类型-set
Set是无序不重复元素的序列,基本功能是删除重复元素和测试成员关系, 创建一个集合可以用set()或者({}),但是创建一个空集合只能用set(): s1 = set() print("s1 ...
- URAL 1519 Formula 1(插头DP,入门题)
Description Background Regardless of the fact, that Vologda could not get rights to hold the Winter ...
- Linux GCC编译
.a 静态库(打包文件 由多个.o文件打包而成) .c 未经过预处理的C源码 .h C头文件 .i 经过预处理的C源码(将头文件内容加载到c文件中) .o 编译之后产生的目标文件 .s 生成的汇编语言 ...
- tabales1.10版参数详解
//@translator codepiano //@blog codepiano //@email codepiano.li@gmail.com //尝试着翻译了一下,难免有错误的地方,欢迎发邮件告 ...
- ACM 第十九天
积性函数 积性函数线性筛,筛素数,u(n),欧拉函数: vis[]=vis[]=,mu[]=,phi[]=; ;i<=N;++i){ ,phi[i]=i-,prime[++cnt]=i; ,k= ...
- LintCode-378.将二叉查找树转换成双链表
将二叉查找树转换成双链表 将一个二叉查找树按照中序遍历转换成双向链表. 样例 给定一个二叉查找树: 返回 1<->2<->3<->4<->5. 标签 链 ...
- OSG学习:位置变换节点示例
osg::PositionAttitudeTransform节点. #include <osgViewer\Viewer> #include <osg\Node> #inclu ...
- LINUX硬件查看命令
1.查看系统PCI设备 lspci lspci -v 显示更详细的PCI设备信息 2.查看CPU信息 more / proc /cpuinfo 3.查看系统内存信息 more /proc /mem ...
- Spring IOC原理简析
所谓IoC, 就是一个用XML来定义生成对象的模式. 1.现有三个类,Human是接口,Chinese是一个实现类,American是另一个实现类. 2.获取以上对象采用工厂模式的用法如下: 创建一个 ...
- perf打印调用栈的过程
perf_prepare_sample-->perf_callchain-->get_perf_callchain 上面的调用栈会使用 perf_event_output--> 0x ...