#include //this is for sweet ladies from Musala Soft <3 using namespace std; #define pb push_back const int maxi=1e5+10; vector v[maxi],vt[maxi],v1[maxi],ans; int n,m; long long bestAns; int ob[maxi],del[maxi],pr[maxi],h[maxi],order[maxi]; pair dp[maxi],longest[maxi], haviest[maxi]; int diamFirst, diamLast, diamLca; long long diamAns,treeDiameter; long long subTree[maxi]; int cnt[maxi]; int currentTreeLevel; map,int> con; void reset_array(int* x,int n) { for (int i=1; i<=n; i++) x[i]=0; } void read() { freopen("maxpath.in","r",stdin); cin>>n>>m; for (int i=1; i<=m; i++) { int x,y; scanf("%d%d",&x,&y); if (n<=100) { con[ {x,y}]=true; con[ {y,x}]=true; } v[x].pb(y); v[y].pb(x); } for (int i=1; i<=n; i++) { v1[i].assign(v[i].begin(),v[i].end()); sort(v1[i].begin(),v1[i].end()); } fclose(stdin); } void makeItBetter(vector ¤tPath) { int sz = currentPath.size(); for (int i=0; ind5) swap(currentPath[i],currentPath[j]); } else { if ((i==0 || con[ {nd1,nd5}]) && (i==sz-1 || con[ {nd3,nd5}]) && (j==0 || con[ {nd2,nd4}]) &&(j==sz-1 || con[ {nd2,nd6}]) && nd2>nd5) swap(currentPath[i],currentPath[j]); } } } void print() { freopen("maxpath.out","w",stdout); if (ans.size()<=100) { makeItBetter(ans); } cout< ¤tPath) { long long currentAns = 0; for (int i=0; ibestAns) { bestAns = currentAns; ans.assign(currentPath.begin(),currentPath.end()); } } void solve1(int idx) { reset_array(ob,n); int currentNode = 1; vector path; while(currentNode < n+1) { path.pb(currentNode); ob[currentNode] = 1; int mm = n+1; for (int i:v[currentNode]) if (!ob[i] && mm>i) { mm=i; } currentNode = mm; } calcRes(path); reverse(path.begin(),path.end()); calcRes(path); } void solve2(int idx) { reset_array(ob,n); int currentNode = idx; vector path; while(currentNode > 0) { path.pb(currentNode); ob[currentNode] = 1; int mm = 0; for (int i:v[currentNode]) if (!ob[i] && mm path; int currentIdx = 0; while(currentNode > 0) { path.pb(currentNode); ob[currentNode] = 1; currentIdx++; int mm = -10000000; for (int i:v[currentNode]) if (!ob[i] && abs(currentIdx-mm)>abs(currentIdx-i)) { mm=i; } currentNode = mm; } calcRes(path); reverse(path.begin(),path.end()); calcRes(path); } bool cmp2(int x, int y) { if (n<=1000) { return cnt[x]/2+x/10 firstMax = {0,x} ; pair secondMax = {0,x}; long long addValue; for (int i:vt[x]) if (i!=pred) { dfsDP(i,x, tip); if (firstMax path, path1; while(diamFirst!=diamLca) { path.pb(diamFirst); diamFirst = pr[diamFirst]; } path.pb(diamLca); while(diamLast!=diamLca) { path1.pb(diamLast); diamLast = pr[diamLast]; } reverse(path1.begin(),path1.end()); for (int i:path1) path.pb(i); assert(path.size()<=n); calcRes(path); reverse(path.begin(),path.end()); calcRes(path); } void solveBig(int x, int tip) { int root = x; reset_array(ob,n); reset_array(pr,n); diamAns = 0; diamFirst = 0; diamLast = 0; diamLca = 0; for (int i=1; i<=n; i++) vt[i].clear(); for (int i=1; i<=n; i++) dp[i]= {0,0}; dfsMakeTree(root,1, tip); dfsDP(root,0,tip); if (tip==2) treeDiameter = diamAns; diameterCalculation(); } bool cmp(int x, int y) { return v[x].size()