联合权值
問(wèn)題 B: 聯(lián)合權(quán)值
時(shí)間限制: 1 Sec??內(nèi)存限制: 128 MB提交: 138??解決: 21
[提交] [狀態(tài)] [討論版] [命題人:admin]
題目描述
無(wú)向連通圖G 有n 個(gè)點(diǎn),n - 1 條邊。點(diǎn)從1 到n 依次編號(hào),編號(hào)為 i 的點(diǎn)的權(quán)值為W i ,每條邊的長(zhǎng)度均為1 。圖上兩點(diǎn)( u , v ) 的距離定義為u 點(diǎn)到v 點(diǎn)的最短距離。對(duì)于圖G 上的點(diǎn)對(duì)( u, v) ,若它們的距離為2 ,則它們之間會(huì)產(chǎn)生Wu×Wv 的聯(lián)合權(quán)值。請(qǐng)問(wèn)圖G 上所有可產(chǎn)生聯(lián)合權(quán)值的有序點(diǎn)對(duì)中,聯(lián)合權(quán)值最大的是多少?所有聯(lián)合權(quán)值之和是多少?
?
輸入
第一行包含1 個(gè)整數(shù)n 。接下來(lái)n - 1 行,每行包含 2 個(gè)用空格隔開(kāi)的正整數(shù)u 、v ,表示編號(hào)為 u 和編號(hào)為v 的點(diǎn)之間有邊相連。
最后1 行,包含 n 個(gè)正整數(shù),每?jī)蓚€(gè)正整數(shù)之間用一個(gè)空格隔開(kāi),其中第 i 個(gè)整數(shù)表示圖G 上編號(hào)為i 的點(diǎn)的權(quán)值為W i 。
?
輸出
輸出共1 行,包含2 個(gè)整數(shù),之間用一個(gè)空格隔開(kāi),依次為圖G 上聯(lián)合權(quán)值的最大值和所有聯(lián)合權(quán)值之和。由于所有聯(lián)合權(quán)值之和可能很大,[b]輸出它時(shí)要對(duì)10007 取余。
?
樣例輸入
復(fù)制樣例數(shù)據(jù)
5 1 2 2 3 3 4 4 5 1 5 2 3 10樣例輸出
20 74?
提示
本例輸入的圖如上所示,距離為2 的有序點(diǎn)對(duì)有( 1,3) 、( 2,4) 、( 3,1) 、( 3,5) 、( 4,2) 、( 5,3) 。
其聯(lián)合權(quán)值分別為2 、15、2 、20、15、20。其中最大的是20,總和為74。
?
?
對(duì)于 30%的數(shù)據(jù),1 < n ≤ 100;
對(duì)于 60%的數(shù)據(jù),1 < n ≤ 2000;
對(duì)于 100%的數(shù)據(jù),1 < n ≤ 200,000,0 <?Wi?≤ 10,000。?
思路:先枚舉以每個(gè)點(diǎn)為中軸點(diǎn),找出與其直接相連的點(diǎn),記錄總值和最大值,判斷一下是否有多個(gè)最大值,然后枚舉每個(gè)點(diǎn)所對(duì)應(yīng)的另一邊的點(diǎn),注意體會(huì)這兩次枚舉的點(diǎn)的差別。
#include<bits/stdc++.h> #define REP(i, a, b) for(int i = (a); i <= (b); ++ i) #define REP(j, a, b) for(int j = (a); j <= (b); ++ j) #define PER(i, a, b) for(int i = (a); i >= (b); -- i) using namespace std; const int maxn=2e6+666; template <class T> inline void rd(T &ret){char c;ret = 0;while ((c = getchar()) < '0' || c > '9');while (c >= '0' && c <= '9'){ret = ret * 10 + (c - '0'), c = getchar();} } long long w[maxn],r,s,t,dis[maxn],tot[maxn],mx[maxn],pos[maxn],cover[maxn],ans,mans; int head[maxn],l; struct node{int v,nx; }p[maxn]; long long n,m; void addedge(int x,int y){p[++l].v=x,p[l].nx=head[y],head[y]=l;p[++l].v=y,p[l].nx=head[x],head[x]=l; }int main(){rd(n);REP(i,1,n-1){int a,b;rd(a),rd(b);addedge(a,b);}REP(i,1,n)rd(w[i]);REP(i,1,n){for(int j=head[i];j;j=p[j].nx){tot[i]+=w[p[j].v];if(mx[i]<w[p[j].v])mx[i]=w[p[j].v],pos[i]=p[j].v,cover[i]=0;else if(mx[i]==w[p[j].v])cover[i]=1;}}REP(i,1,n){for(int j=head[i];j;j=p[j].nx){ans=(ans+w[i]*(tot[p[j].v]-w[i]))%10007;if(cover[p[j].v]||pos[p[j].v]!=i)mans=max(mans,w[i]*mx[p[j].v]);}}cout<<mans<<' '<<ans<<endl;return 0; }?
點(diǎn),統(tǒng)計(jì)答案就好了。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/czy-power/p/10412560.html
總結(jié)
- 上一篇: 影响最大的三位老师
- 下一篇: Nervos CKB 共识协议 NC-M