读不懂题系列
读懂了发现题目其实很水
建了图来一个树上求最长链就好
原因是yy出来的
#include <cstring>
#include <cstdio>
#include <queue>
#include <map>
#define cle(a,b) memset(a,b,sizeof a)
#define LL long long
#define N 1000000LL
std::map<LL,int>m;
std::queue<int>q;
int dis[200010];
int inq[200010];
struct edge {
int v,next;
}e[1200010];
int cnt;
int head[200010];
int n,u,v,w;
void adde (int u,int v) {
e[++cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
e[++cnt].v = u;
e[cnt].next = head[v];
head[v] = cnt;
}
void solve (int u,int v,int i) {
if(!(m.find(u * N + v) == m.end()))
adde(m[u * N + v],i);
else m[u * N + v] = m[v * N + u] = i;
}
void read () {
cle(head,-1);
scanf("%d",&n);
for(int i = 1;i <= n - 2;i++) {
scanf("%d%d%d",&u,&v,&w);
solve(u,v,i);
solve(v,w,i);
solve(u,w,i);
}
}
void spfa () {
int md,mi = 1;
for(int l = 1;l <= 2;l++) {
md = 0;
q.push(mi);
cle(dis,0x3f);
dis[mi] = 1;
while(!q.empty()) {
u = q.front();
q.pop();
inq[u] = 0;
for(int i = head[u];i != -1;i = e[i].next) {
v = e[i].v;
if(dis[v] > dis[u] + 1) {
dis[v] = dis[u] + 1;
if(md < dis[v]) {
md = dis[v];
mi = v;
}
if(!inq[v]) {
inq[v] = 1;
q.push(v);
}
}
}
}
}
printf("%d\n",md);
}
int main () {
read();
spfa();
}