这是我树网的核的代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, s, t, ans = 2e9, a[1000010], top, fa[1000010];
struct node{
int v, w;
};
bool vis[1000010];
int d[1000010];
vector<node>l[1000010];
int read()
{
int x = 0,f = 1;
char c = getchar();
while (c != EOF && !isdigit(c)) {if (c == '-') f = -1;c = getchar();}
while (isdigit(c)) {x = x * 10 + c - '0';c = getchar();}
return x * f;
}
void dfs(int u, int f)
{
fa[u] = f;
if(d[u] > d[top])top = u;
for(int i = 0;i < l[u].size();i ++)
{
int v = l[u][i].v, w = l[u][i].w;
if(v == f or vis[v])continue;
d[v] = d[u] + w;
dfs(v, u);
}
}
signed main()
{
int cnt= 0;
n = read();
s = read();
for(int i = 1;i < n;i ++)
{
int u = read(), v = read(), w = read();
l[u].push_back(node{v, w});
l[v].push_back(node{u, w});
}
d[1] = 1;
dfs(1, 0);
d[top] = 0;
dfs(top, 0);
for(int i = top, j = top, l = 1, r = 0;i;i = fa[i])
{
while(d[j] - d[i] > s)j = fa[j];
cnt = max(d[top] - d[j], d[i]);
ans = min(ans, cnt);
}
for(int i = top;i;i = fa[i])vis[i] = 1;
int k = top;
for(int i = k;i;i = fa[i])
{
top = i;
d[i] = 0;
dfs(i, fa[i]);
}
for(int i = 1;i <= n;i ++)ans = max(ans, d[i]);
cout<<ans;
return 0;
}
这是本题的代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, s, t, ans = 0, a[1000010], top, fa[1000010];
bool vis[200010];
int d[1000010];
vector<int>l[200010];
int read()
{
int x = 0,f = 1;
char c = getchar();
while (c != EOF && !isdigit(c)) {if (c == '-') f = -1;c = getchar();}
while (isdigit(c)) {x = x * 10 + c - '0';c = getchar();}
return x * f;
}
void dfs(int u, int f)
{
fa[u] = f;
if(d[u] > d[top])top = u;
for(int i = 0;i < l[u].size();i ++)
{
int v = l[u][i];
if(v == f or vis[v])continue;
d[v] = d[u] + 1;
dfs(v, u);
}
}
signed main()
{
n = read();
for(int i = 1;i < n;i ++)
{
int u = read(), v = read();
l[u].push_back(v);
l[v].push_back(u);
}
d[1] = 1;
dfs(1, 0);
d[top] = 0;
dfs(top, 0);
int top1 = top, an = d[top];
while(fa[top1])top1 = fa[top1];
for(int i = top;i;i = fa[i])vis[i] = 1;
int k = top;
for(int i = k;i;i = fa[i])
{
top = i;
d[i] = 0;
dfs(i, fa[i]);
}
int w;
for(int i = 1;i <= n;i ++)
{
if(ans < d[i])
{
ans = d[i];
w = i;
}
}
if(ans == 0)w = fa[k];
cout<<an + ans<<endl;
cout<<w<<' '<<k<<' '<<top1<<endl;
return 0;
}
所以写起来与树网的核的区别基本就是多记录个直径外最远点编号?有点乐