题目链接:https://www.luogu.com.cn/problem/P1351

大意是给出一个无向图,求距离为2的相乘权值之和,和最大相乘。

根据公式可以推导

显而易见,这个公式是很容易推导的。

剩下的就是遍历所有的节点,然后去寻找这些值,很水(标签LCA是啥意思!!!)

code:

const int nn = 2e6+10;
const int mod = 1e4+7;
vector<ll> ve[nn];
ll s[nn];
ll ans = 0;
ll mxans = 0;
void dfs(ll x){
	ll sum = 0,ts = 0;
	ll maxt = 0,mxt = 0;
	for(int i=0;i<ve[x].size();i++){
		sum = (sum+s[ve[x][i]])%mod;
		ts = (ts+(s[ve[x][i]]%mod*s[ve[x][i]]%mod))%mod;
		
		if(s[ve[x][i]]>maxt){
			mxt = maxt;
			maxt = s[ve[x][i]];
		}else if(s[ve[x][i]]>mxt){
			mxt = s[ve[x][i]];
		}
	}
	ans = (ans+(sum*sum%mod-ts+mod))%mod;
	mxans = max(mxans,maxt*mxt);
}
void solve()
{
	ll n;
	cin>>n;
	ll a,b;
	for(int i=1;i<n;i++){
		cin>>a>>b;
		ve[a].push_back(b);
		ve[b].push_back(a);
	}
	for(int i=1;i<=n;i++)
		cin>>s[i];
	for(int i=1;i<=n;i++){
		dfs(i);
	}
	cout<<mxans<<' '<<ans<<endl;
}