这题写起来和树网的核差不多?
查看原帖
这题写起来和树网的核差不多?
220426
血色黄昏楼主2022/10/7 16:18

这是我树网的核的代码

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

所以写起来与树网的核的区别基本就是多记录个直径外最远点编号?有点乐

2022/10/7 16:18
加载中...