#B. Cow Marathon

topic


train of thought

This question is obviously to find the diameter of the tree. It is recommended to look at the diameter of Qiushu (the most detailed and ingenious work in history, free to watch for a limited time)


the code

#include <bits/stdc++.h>
using namespace std;
#define int long long
int s,n,a,b,c,h[1000001],vtx[1000001],nxt[1000001],bq[1000001],ans,cd[1000001],t,eg,maxn,maxp;
char r;
void dfs(int beg,int fa,int nw)
{
  cd[beg] = nw;
  for(int i = h[beg]; i; i = nxt[i])
    if(vtx[i] != fa)
      dfs(vtx[i],beg,nw + bq[i]);
}
void adeg(int u,int v,int w)
{
  eg++;
  nxt[eg] = h[u];
  h[u] = eg;
  vtx[eg] = v;
  bq[eg] = w;
}
signed main()
{
  cin>>n>>s;
  for(int i = 1; i <= s; i++)
  {
    cin>>a>>b>>c>>r;
    adeg(a,b,c);
    adeg(b,a,c);
  }
  dfs(1,0,0);
  //for(int i = 1;i <= n;i++) cout<<cd[i]<<" ";
  //cout<<endl;
  for(int i = 1; i <= n; i++)
    if(maxn < cd[i])
    {
      maxn = cd[i];
      maxp = i;
    }
  //cout<<maxn<<" "<<maxp<<endl; 
  dfs(maxp,0,0);
  maxn = maxp = 0;
  for(int i = 1;i <= n;i++)
    if(maxn < cd[i])
    {
      maxn = cd[i];
      maxp = i;
    }
  cout<<maxn;
  return 0;
}
#include<bits/stdc++.h>
using namespace std;
int dp_1[1000001],dp_2[1000001],n,m,ans;
struct nd
{
  int bq,v;
};
vector<nd> vec[1000001];
void dfs(int u,int fa)
{
  dp_1[u] = dp_2[u] = 0;
  for(int i = 0;i < vec[u].size();i++)
  {
      int v = vec[u][i].v;
      if(v == fa) continue;
      dfs(v,u);
      int t = dp_1[v] + vec[u][i].bq;
      if(t > dp_1[u])
    {
      dp_2[u] = dp_1[u];
      dp_1[u] = t;
    }
    else if(t > dp_2[u]) dp_2[u] = t;
  }
  ans = max(ans,dp_1[u] + dp_2[u]);
}
int main()
{
  cin>>n>>m;
  for(int i = 1;i <= m;i++)
  {
    int u,v,w;
    char t;
    cin>>u>>v>>w>>t;
    vec[u].push_back({w,v});
    vec[v].push_back({w,u});
  }
  dfs(1,0);
  printf("%d\n",ans);
  return 0;
}

Guess you like

Origin blog.csdn.net/weq2011/article/details/128767948