題目啦啦啦
n個點,n-1n−1條邊,我們很容易就能想到這是一棵樹,看資料範圍,如果暴力列舉的話,只能拿部分分,這時候我們就回到題目中看,發現,只有距離為22才會產生價值的話,如果列舉乙個節點,只有 它和它的孫子之間 或者 它的兩個兒子之間 才會產生價值,所以我們就可以列舉這個節點,進行dfsdfs,期間進行更新就好了,具體的實現可以看**
1 #include 2 #include 3 #include 4 #include 5using
namespace
std;
67 inline int
read()
1415
const
int n = 1e6 + 11;16
const
int m = 2e5 + 7;17
const
int mod = 10007;18
19//
鄰接表存圖
20struct
node e[n];
2324
int head[m], cnt = 0;25
26 inline void add(int
from, int
to)
3132
intn, w[m], x, y, tot[m], ma[m], cma[m], ans, maxn;
33//
tot[x]陣列記錄x所有兒子的價值,ma[x]記錄x所有兒子中的最大值,cma[x]記錄x所有兒子中的次大值
3435
//dfs!!
36void dfs(int u, int
fa)
48//
兒子之間產生的價值
49for(int i = head[u]; i; i =e[i].nxt) 56}
5758
intmain()
65for(int i = 1; i <= n; i++) w[i] = read();//
cout << w[i] << '\n';
66 dfs(1, 0
);67
while(ans < 0) ans += mod; //
答案可能是負的,只要是負的就一直加模數
68 cout << maxn << "
"<< ans << '\n'
;69return0;
70 }
P1351 聯合權值
無向連通圖g有n個點,n 1 條邊。點從1到n依次編號,編號為i的點的權值為w i 每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會產生wv wu的聯合權值。請問圖 g上所有可產生聯合權值的有序點對中,聯...
P1351 聯合權值
然而這只是一道普及 提高的大水題 洛谷鏈結 這道題是2014年提高組day1的第二題。簡單題意就是在樹上每個點都有權值,相鄰兩點的距離為1,求距離為2的點的權值乘積的和以及最大值。基本思路就是遍歷整棵樹,然後找到距離該點距離為2的點,計算距離,更新最大值和乘積和。但這樣就很慢了。所以我們可以遍歷中間...
P1351 聯合權值
為了寫一寫lca,我就按照標籤找 結果這道題我寫完竟然沒用lca 真是神奇。很多人 包括我 首先就想到了要列舉每乙個點,再列舉任意這個點的兩個兒子,可是顯然o n2 會t 其實我們只要線性掃一遍就可以了,利用小學學到的乘法分配率,邊走邊加val,這樣下乙個點和val的乘積就是它和這之前所有的點的乘積...