日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[TJOI2012] 旅游(树的直径)

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [TJOI2012] 旅游(树的直径) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

problem

寫的什么jb題意!這個語文水平。。。。

洛谷的一堆題解看下來也沒懂他們懂得題目大意,真是給我蚌埠住了

luogu評測鏈接

一句話題意:給定一個三角剖分,求任意兩頂點穿過的最多三角形個數(只經過某三角形頂點則不算穿過該三角形)

solution

一般三角剖分就先往轉化成樹的方向思考。—— Quack\text{Quack}Quack

一條線穿過的三角形,相鄰兩個肯定是有鄰邊的。

我們把三角形(即城市)看成一個點,與其有鄰邊的城市之間就連一條邊。

那么會發現這個穿的路線就是在這個樹上跑一條鏈。

最大化個數就是最長化鏈長,那要求的就是這個樹的直徑。

所以這道題的難點在于你讀懂題目了嗎?

這個連邊后一定是個樹,不會出現環。

n?2n-2n?2 個三角形,只需要 n?3n-3n?3 條邊就可以剖分出來。

且這個三角剖分的三個點都是頂點,相當于是生成圖上的一條邊,n?2n-2n?2 個城市點,n?3n-3n?3 條邊。

生成環意味著有一堆三角形圍住了一個城市點,這顯然不可能。

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; }

總結

以上是生活随笔為你收集整理的[TJOI2012] 旅游(树的直径)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。