題目描述
無向連通圖g 有n 個點,n - 1 條邊。點從1 到n 依次編號,編號為 i 的點的權值為w i ,每條邊的長度均為1 。圖上兩點( u , v ) 的距離定義為u 點到v 點的最短距離。對於圖g 上的點對( u, v) ,若它們的距離為2 ,則它們之間會產生wu×wv 的聯合權值。
請問圖g 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少?
輸入輸出格式
輸入格式:
輸入檔名為link .in。
第一行包含1 個整數n 。
接下來n - 1 行,每行包含 2 個用空格隔開的正整數u 、v ,表示編號為 u 和編號為v 的點之間有邊相連。
最後1 行,包含 n 個正整數,每兩個正整數之間用乙個空格隔開,其中第 i 個整數表示圖g 上編號為i 的點的權值為w i 。
輸出格式:
輸出檔名為link .out 。
輸出共1 行,包含2 個整數,之間用乙個空格隔開,依次為圖g 上聯合權值的最大值
和所有聯合權值之和。由於所有聯合權值之和可能很大,輸出它時要對10007 取餘。
輸入輸出樣例
輸入樣例#1:
5 1 2
2 3
3 4
4 5
1 5 2 3 10
輸出樣例#1:
20 74
分析:
舊題重做還是有很多感觸的:
給我們乙個啟示,在做相同操作時,能合併的盡量合併
這裡寫**片
#include
#include
#include
#define ll long long
using
namespace
std;
const
long
long mod=10007;
const
int n=250000;
struct node;
node way[n];
int v[n];
int st[n],tot=0,n;
ll sum=0,mx=0;
ll s[n],m1[n],m2[n];
void add(int u,int w)
ll max(ll a,ll b)
int main()
for (int i=1;i<=n;i++) scanf("%d",&v[i]);
for (int i=1;iint x=way[i].x;
int y=way[i].y;
s[x]+=v[y]; //與x相連的所有權值之和
s[y]+=v[x];
if (v[y]>m1[x])
else
if (v[y]>m2[x])
if (v[x]>m1[y])
else
if (v[x]>m2[y])
}for (int i=1;i<=n;i++)
mx=max(mx,(ll)m1[i]*m2[i]);
for (int i=1;iprintf("%lld %lld",mx,sum);
return
0;}
Luogu P1351 聯合權值
無向連通圖g有n個點,n 1條邊,點從1到n依次編號,編號為i的點的權值為wi每條邊的長度均為1圖上兩點 u,v 的距離定義為u點到v點的最短距離。對於圖g上的點對 u,v 若它們的距離為2,則它們之間會產生wu wv 的聯合權值。請問圖g 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所...
Luogu P1351 聯合權值
無向連通圖 gg 有 nn 個點,n 1n 1 條邊。點從 11 到 nn 依次編號,編號為 ii 的點的權值為 w iwi 每條邊的長度均為 11。圖上兩點 u,v u,v 的距離定義為 uu 點到 vv 點的最短距離。對於圖 gg 上的點對 u,v u,v 若它們的距離為 22,則它們之間會產生...
Luogu P1351 聯合權值 字首和
求樹上距離為二的點對權積之最值 和。70pts 列舉每個點,bfs兩層求和求最值和和。100pts 列舉每個點,先統計所有可達節點的權值和,再列舉可達點求權值和 第二種做法較第一種的優化 a1 a2 a1 a3 a1 a4 a2 a1 a2 a3 a1 sum a1 a2 sum a2 好巧妙啊 要...