C++课后习题训练记录Day184

📅 2026/8/11 3:35:00
C++课后习题训练记录Day184
1.练习项目 问题描述给定一棵树树中包含 n 个结点编号为 1∼n 以及 n−1 条无向边每条边都有一个权值。现从树中任选一个点从该点出发在不走回头路的情况下找出二条到其他点的路径这二条路径不能有公共边请问这二条路径长度的乘积最大可以是多少。注如果从该点出发只有一个方向可以走换句话说该点入度出度为 1则乘积为 0 。输入格式第一行输入一个整数 n。接下来 n−1 行每行输入包含三个整数 ai,bi,ci​表示点 ai​ 和 bi​ 之间存在一条权值为 ci​ 的边。输出格式输出一个整数为二条路径长度乘积的最大值。2.选择课程在蓝桥云课中选择题库选择题号3649并开始练习。3.开始练习1源码 #includebits/stdc.husing namespace std;using lllong long;const int N1e510;int n;vectorpairint,intg[N];int d1[N],d2[N],p1[N],p2[N],up[N];void dfs1(int u,int f){for(const autov:g[u]){if(v.firstf)continue;dfs1(v.first,u);int lenv.secondd1[v.first];if(lend1[u]){d2[u]d1[u];p2[u]p1[u];d1[u]len;p1[u]v.first;}else if(lend2[u]){d2[u]len;p2[u]v.first;}}}void dfs2(int u,int f){for(const autov:g[u]){if(v.firstf)continue;if(p1[u]v.first){up[v.first]max(up[u],d2[u])v.second;}else{up[v.first]max(up[u],d1[u])v.second;}dfs2(v.first,u);}}int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cinn;for(int i1;in;i){int a,b,c;cinabc;g[a].push_back({b,c});g[b].push_back({a,c});}dfs1(1,0);dfs2(1,0);ll ans0;for(int i1;in;i){ansmax(ans,(ll)max((ll)d1[i]*d2[i],(ll)d1[i]*up[i]));}coutans\n;return 0;}2检验结果对此代码进行检验检验后无报错提交此代码判题结果为正确100分。3练习心得注意每段代码末尾的分号是否存在 如不存在则需即使补充输入法 是否切换为英语模式语法是否错误。