[TJOI2012] 旅游(树的直径)
生活随笔
收集整理的這篇文章主要介紹了
[TJOI2012] 旅游(树的直径)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
problem
寫的什么jb題意!這個語文水平。。。。
洛谷的一堆題解看下來也沒懂他們懂得題目大意,真是給我蚌埠住了
luogu評測鏈接
一句話題意:給定一個三角剖分,求任意兩頂點穿過的最多三角形個數(shù)(只經(jīng)過某三角形頂點則不算穿過該三角形)
solution
一般三角剖分就先往轉(zhuǎn)化成樹的方向思考。—— Quack\text{Quack}Quack。
一條線穿過的三角形,相鄰兩個肯定是有鄰邊的。
我們把三角形(即城市)看成一個點,與其有鄰邊的城市之間就連一條邊。
那么會發(fā)現(xiàn)這個穿的路線就是在這個樹上跑一條鏈。
最大化個數(shù)就是最長化鏈長,那要求的就是這個樹的直徑。
所以這道題的難點在于你讀懂題目了嗎?
這個連邊后一定是個樹,不會出現(xiàn)環(huán)。
n?2n-2n?2 個三角形,只需要 n?3n-3n?3 條邊就可以剖分出來。
且這個三角剖分的三個點都是頂點,相當(dāng)于是生成圖上的一條邊,n?2n-2n?2 個城市點,n?3n-3n?3 條邊。
生成環(huán)意味著有一堆三角形圍住了一個城市點,這顯然不可能。
code
#include <bits/stdc++.h> using namespace std; #define maxn 200005 map < pair < int, int >, int > mp; vector < int > G[maxn]; int n, ans; int dp[maxn];void dfs( int u, int fa ) {dp[u] = 1;for( int v : G[u] ) {if( v == fa ) continue;else dfs( v, u );ans = max( ans, dp[u] + dp[v] );dp[u] = max( dp[u], dp[v] + 1 );} }int main() {scanf( "%d", &n );int x[5];for( int i = 1;i <= n - 2;i ++ ) {for( int j = 1;j <= 3;j ++ ) scanf( "%d", &x[j] );sort( x + 1, x + 4 );for( int j = 1;j <= 3;j ++ )for( int k = j + 1;k <= 3;k ++ )if( ! mp[make_pair( x[j], x[k] )] )mp[make_pair( x[j], x[k] )] = i;else {G[i].push_back( mp[make_pair( x[j], x[k] )] );G[mp[make_pair( x[j], x[k] )]].push_back( i );}}dfs( 1, 0 );printf( "%d\n", ans );return 0; }總結(jié)
以上是生活随笔為你收集整理的[TJOI2012] 旅游(树的直径)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 空调遥控器丢了怎么办
- 下一篇: [ZJOI2011]营救皮卡丘(费用流