题目:
1207. 大臣的旅费 - AcWing题库
思路:
dfs求树的直径。
代码:
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=100100;
struct Edge//边的id以及长度
{int id,w;
};vector<Edge>Node[N];//存储结点Node[i]相连的所以边另一端的结点编号以及边的长度
int dist[N];//距离起始结点的距离void dfs(int u,int father,int distance)
{dist[u]=distance;for(auto node:Node[u])//遍历当前结点的所以关联结点if(node.id!=father)//不重复dfs(node.id,u,distance+node.w);
}
int main()
{int n;cin>>n;for(int i=0;i<n-1;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);Node[a].push_back({b,c});Node[b].push_back({a,c});}int u=1;//以结点1为起点dfs(1,-1,0);//找到距离结点1最远的结点for(int i=1;i<=n;i++)if(dist[i]>dist[u])u=i;//距离结点1最远的结点编号为udfs(u,-1,0);//以结点u为起点,找到距离结点u的最远的结点ufor(int i=1;i<=n;i++)if(dist[i]>dist[u])u=i;//距离结点最远的结点编号为uint s=dist[u];printf("%lld",s*10+(1ll+s)*s/2);
}