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