無向連通圖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: 複製1 2
2 33 4
4 5
1 5 2 3 10
本例輸入的圖如上所示,距離為2 的有序點對有( 1,3) 、( 2,4) 、( 3,1) 、( 3,5) 、( 4,2) 、( 5,3) 。
其聯合權值分別為2 、15、2 、20、15、20。其中最大的是20,總和為74。
【資料說明】
對於30% 的資料,1 < n≤ 100 ;
對於60% 的資料,1 < n≤ 2000;
對於100%的資料,1 < n≤ 200 , 000 ,0 < wi≤ 10, 000 。
這個題以亂搞為主。
我們可以發現直接列舉乙個點兩邊的點就相當於同時列舉兩點了,所以我們直接列舉乙個點兩邊的點。考慮這樣複雜度還是太高(n^2),我們嘗試優化。
首先,對於乙個點的最大的聯合權值,一定是其所有出點權值中最大和次大的乘積(如果只有乙個,則次大不存在,聯合權值為0),我們可以在列舉點的時候順便處理出最大和次大值來。其次,對於乙個點的聯合權值之和,為σw[i]*w[j],(i,j為點u的出點,且i,j有序),我們從這個式子中不難發現,乙個出點i可以和點u的任意乙個出點j(i≠j)產生一定的聯合權值,總的來說就是i對答案的貢獻為w[i]*(w[j1]+w[j2]+...+w[jd])(在這個式子中不含w[i]),(d為u的出度),如果令sum表示u的所有出點的權值之和,那麼i對答案的貢獻也可以寫成w[i]*(sum-w[i]),那麼,我們可以預處理出sum來,然後對出點進行一次遍歷,計算出所有的w[i]*(sum-w[i]),則σw[i]*(sum-w[i]),就是點u對答案的貢獻。最後相加即可。
這題的難點就在於開腦洞,和各種數學知識亂搞就行了。
#include#include#include
#include
#include
#include
using
namespace
std;
const
int n=2e5+5
;inline
intread()
while(c>='
0'&&c<='9'
)
return ret*f;
}int
n;struct
edgee[n
<<1
];int head[n],nxt[n<<1],tot=0
;void adde(int f,intt);
nxt[tot]=head[f];
head[f]=tot;
}int
w[n];
int maxw=0,sumw=0
;const
int mod=10007
;void
solve()
else
sum+=w[v];
sum%=mod;
}maxw=max(maxw,fir*sec);
for(int j=head[i];j;j=nxt[j])
}}int
main()
for(int i=1;i<=n;i++) w[i]=read();
solve();
printf(
"%d %d
",maxw,sumw%mod);
return0;
}
NOIP2014 聯合權值
鄰接表儲存樹。列舉每個節點,使之作為中點,先計算出與其相連的所有節點的權值總和l,與其相連的所有節點在該節點處形成的權值 l w w。如果沒有l,直接列舉以此節點為中點的節點對則只能過60 的資料。include include include include include include inc...
NOIP 2014 聯合權值
評測傳送 70分 列舉中間點,然後再兩層迴圈列舉這個點的所有鄰接點,兩兩相乘,加入和中。可能退化為n 2 100分 在70分的基礎上加乙個優化,當我們列舉了中間點,然後再列舉它的鄰接點 j 時,用sum i 表示 i 的所有鄰接點的權值的和,那麼以 i 作為中間點,j這個點對答案的貢獻為 sum i...
(noip2014)聯合權值
題目傳送門sxazr 本題可直接列舉每個點,然後列舉與它相連的兩個點,這兩個點的乘積便是乙個聯合權值 可以記錄下每個點與它相連的點的最大值和次大值,結果就是取最大值和次大值乘積的最大 求和的話,可以記錄下乙個點相連所有點的和s i sum w j s i w j j是與i相連的點 列舉每個點的sum...