题意:在一棵二叉树里找最远的两个点的距离,题目的输入和树的构建的看了好久,保存邻接边的信息,每次将一个节点加进树里,因为每次输入都要有输出,即:每次都要更新最大值,所以DFS一次就可以了,判断是否存在环,不然会RE
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 10100; long long ans = 0; int p[MAXN],next[MAXN]; int u[MAXN],v[MAXN],w[MAXN],x,y,z; long long dfs(int V,int k){ long long Max = 0; for (int e = p[V]; e != -1; e = next[e]){ if (v[e] != k){ long long sum = dfs(v[e],V) + w[e]; if (ans < Max+sum) ans = Max + sum; if (Max < sum) Max = sum; } } return Max; } int main(){ int cnt = 0; ans = 0; memset(p,-1,sizeof(p)); char str[100]; while (1){ char *k = gets(str); if (k == NULL){ dfs(1,-1); printf("%lld\n",ans); break; } else if (str[0] == '\0'){ dfs(1,-1); printf("%lld\n",ans); cnt = 0,ans = 0; memset(p,-1,sizeof(p)); continue; } sscanf(str,"%d%d%d",&x,&y,&z); u[cnt] = x,v[cnt] = y,w[cnt] = z; next[cnt] = p[x],p[x] = cnt; cnt++; u[cnt] = y,v[cnt] = x,w[cnt] = z; next[cnt] = p[y],p[y] = cnt; cnt++; } return 0; }