题目链接: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; }