洛谷题目链接:[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]旅游的更多相关文章

  1. [洛谷P2597] [ZJOI2012]灾难

    洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...

  2. 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告

    P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ...

  3. P2610 [ZJOI2012]旅游

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

  4. 洛谷 P2096 最佳旅游线路

    某旅游区的街道成网格状.其中东西向的街道都是旅游街,南北向的街道都是林阴道.由于游客众多,旅游街被规定为单行道,游客在旅游街上只能从西向东走,在林阴道上则既可从南向北走,也可以从北向南走. 阿龙想到这 ...

  5. 洛谷 P2609 [ZJOI2012]数列 解题报告

    P2609 [ZJOI2012]数列 题目描述 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: A(0)=0 A(1)=1 A(2i)=A(i) (对于任意 i>0 ...

  6. 洛谷 P2597 [ZJOI2012]灾难 解题报告

    P2597 [ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发 ...

  7. 洛谷 P2173 [ZJOI2012]网络 解题报告

    P2173 [ZJOI2012]网络 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环, ...

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

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

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

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

随机推荐

  1. vuejs学习之 项目打包之后的首屏加载优化

    vuejs学习之 项目打包之后的首屏加载优化 一:使用CDN资源 我们在打包时,会将package.json里,dependencies对象里插件打包起来,我们可以将其中的一些使用cdn的方式加载,例 ...

  2. 实用的ES6特性

    1. 函数参数默认值 不使用ES6 为函数的参数设置默认值: function foo(height, color) { var height = height || 50; var color = ...

  3. NSValue的valueWithBytes:objCType:方法

    + (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type; NSValue的valueWithBytes: ...

  4. Python 零碎信息-基础 02

    1. range xrange 的差别 1.1 range 返回列表对象. 1.2 xrange 返回xrange对象  不需要返回列表里面的值, 节省内存. >>> range(1 ...

  5. iOS开发自定义试图切换

    CATransition *transition = [CATransition animation]; transition.duration = 1.0f; transition.timingFu ...

  6. CEntOS6.5从启动界面直接进入命令行界面

    ctrl + alt + F1 ctrl + alt + F2 ctrl + alt + F3 ctrl + alt + F4 ctrl + alt + F5 ctrl + alt + F6 同时按下 ...

  7. oracle的SQL语句中的(+)是干什么用的?

    Oracle中的(+) 是外连接,如果在等号的左边就是左连接 和如果在等号的右边就是右连接 和left join ,right join 比较相似.....where sn (+) ='5620030 ...

  8. 在Delphi中如何获得SQL中存储过程的返回值?

    示例存储过程:create procedure proc_loginusername varchar(20),password varchar(20)asdeclare @result intsele ...

  9. C#中整型数据类型

    C#中整型数据类型byte是8位的无符号整数,可是它表示的值的范围是0-255才3位啊怎么说是8位啊?谁能帮我解答 全部答案   八位二进制.0000 0000到1111 1111相当于十进制0-25 ...

  10. 【bzoj5064】B-number 数位dp

    题目描述 B数的定义:能被13整除且本身包含字符串"13"的数. 例如:130和2613是B数,但是143和2639不是B数. 你的任务是计算1到n之间有多少个数是B数. 输入 输 ...