题目:1207. 大臣的旅费
思路: 先从1出发找到距离该点最大的点m,再从m出发找到距离m最大的点z即可,其中可得最大的距离ans
方法一:dfs
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int >PII;
const int N=1e5+10;
const int mod=100000007;
int n;
vector<PII> g[N];
bool sta[N];
int ans=0;
int idx=1;
void dfs(int u,int c){
sta[u]=1;
if(ans<c){
idx=u;
ans=c;
}
for(int i=0;i<g[u].size();i++){
if(!sta[g[u][i].first]){
dfs(g[u][i].first,g[u][i].second+c);
}
}
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
g[x].push_back({y,z});
g[y].push_back({x,z});
}
dfs(1,0);
memset(sta,0,sizeof sta);
ans=0;
//cout<<idx<<endl;
dfs(idx,0);
LL sum=0;
//cout<<idx<<endl;
sum=1ll*ans*10+(1+ans)*1ll*ans/2;
printf("%lld",sum);
return 0;
}
方法二:bfs
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int >PII;
const int N=1e5+10;
const int mod=100000007;
int n;
vector<PII> g[N];
bool sta[N];
int ans=0;
int idx=1;
void bfs(int u){
queue<PII> q;
q.push({u,0});
while(q.size()){
PII t=q.front();
q.pop();
sta[t.first]=1;
if(ans<t.second){
ans=t.second;
idx=t.first;
}
for(int i=0;i<g[t.first].size();i++){
if(!sta[g[t.first][i].first]){
q.push({g[t.first][i].first,t.second+g[t.first][i].second});
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
g[x].push_back({y,z});
g[y].push_back({x,z});
}
bfs(1);
memset(sta,0,sizeof sta);
ans=0;
bfs(idx);
LL sum=0;
//cout<<idx<<endl;
sum=1ll*ans*10+(1+ans)*1ll*ans/2;
printf("%lld",sum);
return 0;
}