題意:
無向連通圖 g 有 n 個點,n−1 條邊。
點從 1 到 n 依次編號,編號為 i 的點的權值為 $w_i$ ,每條邊的長度均為 1。
圖上兩點 (u,v) 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 (u,v),若它們的距離為 2,則它們之間會產生$w_v*w_u$ 的聯合權值。
請問圖 g 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少?
權值和的結果對10007取模
首先,暴力。。。對每個點爆搜,限制dep=2,統計答案
//打完暴力交上去才發現,woc,(u,v)與(v,u)不等同!!暴力70分~~~~~~~~~~~~
#include#include
#include
#include
#include
#include
using
namespace
std;
#define int long long
#define olinr return
#define nmr 205050
#define _ 0
#define love_nmr 0
#define mod 10007
#define db double
intw[nmr];
vector
g[nmr];
intn;
inline
intread()
while
(isdigit(ch))
return x*f;
}inline
void put(int
x)
if(x>9
) put(x/10
); putchar(x%10+'0'
);}intans;
inttot;
inline
void dfs(int fir,int x,int fa,int
dep)
for(int i=0;i)
}signed main()
for(int i=1;i<=n;i++)
w[i]=read();
for(int i=1;i<=n;i++)
dfs(i,i,
0,0);
put(ans);
putchar(''
); put(tot);
olinr ~~(0^_^0)+love_nmr;
}
也就是說,統計權值和應該算兩次!而上面的暴力正好做到了qaq
正解。。。。。。666
因為長度為2,也就是3給點,我們列舉中間點,如圖,1,2,3,4,5,6任意組合都成立。。。
所以,對於每個點,直接列舉它直接相連的點,兩兩組合就行了qaq
對於權值和,比如我們進行到了4
那麼它可以與1,2,3,組合
權值和+=($4*1+4*2+4*3=(1+2+3)*4$)
額這可以用字首和。。。
所以,對每個點
維護乙個字首和
維護乙個字首最大值
最後別忘$*2$和取模就行了
#include#include#include
#include
#include
#include
using
namespace
std;
#define int long long
#define olinr return
#define nmr 205050
#define _ 0
#define love_nmr 0
#define mod 10007
#define db double
intw[nmr];
vector
g[nmr];
intn;
ints[nmr];
intmaxx[nmr];
inline
intread()
while
(isdigit(ch))
return x*f;
}inline
void put(int
x)
if(x>9
) put(x/10
); putchar(x%10+'0'
);}intans;
inttot;
intcnt;
signed main()
for(int i=1;i<=n;i++)
w[i]=read();
for(int i=1;i<=n;i++)
}
put(ans);
putchar(''
); put((tot
<<1)%mod);
olinr ~~(0^_^0)+love_nmr;
}
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的乘積就是它和這之前所有的點的乘積...