题解 P2610 【[ZJOI2012]旅游】
今天模拟赛考了这道题,那就来水一篇题解吧。。。(话说提高组模拟赛考什么省选题啊??)
这道题要我们求一条线段最多能经过的三角形数量。
回想小学学过的奥数,老师告诉过我们这样一件事:`点无大小 线无粗细`。
既然如此,为什么不能把这条线段看成一条巨大的把三角形看成点呢?
那么本题的思路就出来了:我们把三角形看成点,然后建立一颗二叉树,在树上跑两边BFS求直径就可以了。
可是为什么我们一定能建成二叉树呢?
其实很好证明。
三角形只有三条边,那么最多能有一个父亲和两个儿子,所以是二叉树。
当然,这个东西不是特别重要。
重点是,我们接下来怎么建图?
这里我是这样解决的:
先把每一条边都存进一个map里面,然后map手写结构体统计边出现的次数。
然后遍历一遍map,把所有出现不止一次的边两端的三角形连在一起。
这个办法唯一的问题是常数比较大,写的丑就容易TLE(然而机房的lemon竟然可以AC!)。
AC代码如下:
955ms 38272kb
#include<bits/stdc++.h>
using namespace std;
namespace StandardIO{
template<typename T>inline void read(T &x){
x=;T f=;char c=getchar();
for(;c<''||c>'';c=getchar())if(c=='-')f=-;
for(;c>=''&&c<='';c=getchar())x=x*+c-'';
x*=f;
}
template<typename T>inline void write(T x){
if(x<)putchar('-'),x*=-;
if(x>=)write(x/);
putchar(x%+'');
}
}
using namespace StandardIO;
namespace Solve{
const int N=;
int n;
struct __normal_pair{
int first,second;
inline bool operator < (const __normal_pair &x)const{
if(first==x.first)return second<x.second;
return first<x.first;
}
};
struct __store_pair{
int first,second,size;
inline void push_back(int id){
if(size++)second=id;
else first=id;
}
};
map<__normal_pair,__store_pair>edge;
vector<int>graph[N];
int dis[N],vis[N];
inline __normal_pair make_pair(int f,int s){
return (__normal_pair){f,s};
}
inline void sor(int &a,int &b,int &c){
if(a>b)swap(a,b);
if(a>c)swap(a,c);
if(b>c)swap(b,c);
}
inline int bfs(int s,int time){
queue<int>q;
dis[s]=,vis[s]=time;
q.push(s);
int final;
while(!q.empty()){
final=q.front();q.pop();
for(register vector<int>::iterator i=graph[final].begin();i!=graph[final].end();++i){
if(vis[*i]==time)continue;
vis[*i]=time,dis[*i]=dis[final]+;
q.push(*i);
}
}
return final;
}
inline void solve(){
read(n);
for(register int i=;i<=n-;++i){
int p,q,r;
read(p),read(q),read(r);
sor(p,q,r);
edge[make_pair(p,q)].push_back(i);
edge[make_pair(q,r)].push_back(i);
edge[make_pair(p,r)].push_back(i);
}
for(register map<__normal_pair,__store_pair>::iterator i=edge.begin();i!=edge.end();++i){
if(i->second.size>){
graph[i->second.first].push_back(i->second.second);
graph[i->second.second].push_back(i->second.first);
}
}
write(dis[bfs(bfs(,),)]+);
}
}
using namespace Solve;
int main(){
// freopen("triangulation9.in","r",stdin);
// freopen("triangulation.out","w",stdout);
solve();
}
题解 P2610 【[ZJOI2012]旅游】的更多相关文章
- [洛谷P2610] [ZJOI2012]旅游
洛谷题目链接:[ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个 ...
- 【题解】P2610 [ZJOI2012]旅游
link 题意 T国的国土可以用一个凸N边形来表示,包含 \(N-2\) 个城市,每个城市都是顶点为 \(N\) 边形顶点的三角形,两人的旅游路线可以看做是连接N个顶点中不相邻两点的线段.问一路能经过 ...
- P2610 [ZJOI2012]旅游
题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示,N个顶点表示N个入境/出 ...
- P2610 [ZJOI2012]旅游 树的直径
这个题就是建图不太好建,但是我们一想,三角形貌似只能两两挨着,最后会变成一个二叉树,所以问题就变成求树的直径.建图用pair套map超级简单. 题干: 到了难得的暑假,为了庆祝小白在数学考试中取得的优 ...
- [ZJOI2012]旅游(树的直径)
[ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示 ...
- BZOJ2657:[ZJOI2012]旅游——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2657 https://www.luogu.org/problemnew/show/P2610 到了难 ...
- P2610 【[ZJOI2012]旅游】(dfs+树的直径)
楼下那篇题解说实话就是什么都没说,所以我再发一篇正常一点的. 楼下思路大体是正确的,但是之所以是说什么都没说,是因为他有两个比较致命的遗漏.首先是点,这里的点不是平时我们认为的点,如果多少接触过对偶图 ...
- BZOJ2657 [Zjoi2012]旅游(journey) 【树的直径】
题目 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示,N个顶点表示N个入境/出境口 ...
- [bzoj2657][Zjoi2012]旅游 journey_ 对偶图_树形dp
旅游 bzoj-2657 Zjoi-2012 题目大意:题目链接 注释:$1\le K\le 2\cdot 10^5$. 想法:这题... 感觉和上一个题的提示有些类似,就是题目生怕你不知道这是一道对 ...
随机推荐
- thread.h
https://github.com/wookayin/pintos/blob/master/src/threads/thread.h #ifndef THREADS_THREAD_H #defi ...
- Docker中免去sudo的设置方法
Add the docker group if it doesn't already exist: sudo groupadd docker Add the connected user " ...
- java中的json
josn: 一种数据传输格式,与开发语言无关,轻量级 一开始是javaScript的,但是后面比较流传,几乎所有语言都有相应的使用API 数据结构: Object---对象 使用花括号{}包含的键值对 ...
- 简单暴力的TP5多主题方案
一个小项目,需要配置多套前端主题.解决的思路是根据域名加载不同的主题配置. 一.在应用目录 application 下创建 common 目录. 二.application/common 目录下创建 ...
- Vue中两种跳转方式
第一种:通过标签跳转,<router-link></router-link> 第二种:通过js跳转,定义点击事件进行跳转
- HDU-3746 Cyclic Nacklace 字符串匹配 KMP算法 求最小循环节
题目链接:https://cn.vjudge.net/problem/HDU-3746 题意 给一串珠子,我们可以在珠子的最右端或最左端加一些珠子 问做一条包含循环珠子的项链,最少还需要多少珠子 思路 ...
- 洛谷 P1169 [ZJOI2007]棋盘制作 (悬线法)
和玉蟾宫很像,条件改成不相等就行了. 悬线法题目 洛谷 P1169 p4147 p2701 p1387 #include<cstdio> #include<algorithm& ...
- ZOJ 3369 Saving Princess
Saving Princess Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on ZJU. Origina ...
- hadoop-14-进行libtirpc的rpm包安装
hadoop-14-进行libtirpc的rpm包安装 安装过程中出现了这个问题,进行安装: yum localinstall --nogpgcheck libtirpc-0.2.1-13.el6.x ...
- Activity生命周期的运行流程
Activity的生命周期运行流程: ·当Activity第1次被启动: ·onCreate()->onStart()->onResume() ·当Activity被遮挡后再次 ...