#B. Cow Marathon

题目


思路

这题很明显是求树的直径。建议看看求树的直径(史上最详细,匠心之作,限时免费看)


代码

#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;
}

猜你喜欢

转载自blog.csdn.net/weq2011/article/details/128767948