[TJOI2012] 旅游(树的直径)
problem
寫的什么jb題意!這個(gè)語文水平。。。。
洛谷的一堆題解看下來也沒懂他們懂得題目大意,真是給我蚌埠住了
luogu評(píng)測鏈接
一句話題意:給定一個(gè)三角剖分,求任意兩頂點(diǎn)穿過的最多三角形個(gè)數(shù)(只經(jīng)過某三角形頂點(diǎn)則不算穿過該三角形)
solution
一般三角剖分就先往轉(zhuǎn)化成樹的方向思考。—— Quack\text{Quack}Quack。
一條線穿過的三角形,相鄰兩個(gè)肯定是有鄰邊的。
我們把三角形(即城市)看成一個(gè)點(diǎn),與其有鄰邊的城市之間就連一條邊。
那么會(huì)發(fā)現(xiàn)這個(gè)穿的路線就是在這個(gè)樹上跑一條鏈。
最大化個(gè)數(shù)就是最長化鏈長,那要求的就是這個(gè)樹的直徑。
所以這道題的難點(diǎn)在于你讀懂題目了嗎?
這個(gè)連邊后一定是個(gè)樹,不會(huì)出現(xiàn)環(huán)。
n?2n-2n?2 個(gè)三角形,只需要 n?3n-3n?3 條邊就可以剖分出來。
且這個(gè)三角剖分的三個(gè)點(diǎn)都是頂點(diǎn),相當(dāng)于是生成圖上的一條邊,n?2n-2n?2 個(gè)城市點(diǎn),n?3n-3n?3 條邊。
生成環(huán)意味著有一堆三角形圍住了一個(gè)城市點(diǎ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]营救皮卡丘(费用流