题目
思路
这题很明显是求树的直径。建议看看求树的直径(史上最详细,匠心之作,限时免费看)
代码
#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;
}