無向連通圖g 有n 個點,n - 1 條邊。點從1 到n 依次編號,編號為 i 的點的權值為w i ,每條邊的長度均為1 。圖上兩點( u , v ) 的距離定義為u 點到v 點的最短距離。對於圖g 上的點對( u, v) ,若它們的距離為2 ,則它們之間會產生wu×wv 的聯合權值。
請問圖g 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少?
第一行包含1 個整數n 。
接下來n - 1 行,每行包含 2 個用空格隔開的正整數u 、v ,表示編號為 u 和編號為v 的點之間有邊相連。
最後1 行,包含 n 個正整數,每兩個正整數之間用乙個空格隔開,其中第 i 個整數表示圖g 上編號為i 的點的權值為w i 。
輸出共1 行,包含2 個整數,之間用乙個空格隔開,依次為圖g 上聯合權值的最大值
和所有聯合權值之和。由於所有聯合權值之和可能很大,輸出它時要對10007 取餘。
51 2
2 33 4
4 5
1 5 2 3 10
20 74【樣例說明】
本例輸入的圖如上所示,距離為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 。
時間限制:1000ms
空間限制:256mbyte
這個題目暴力列舉很明顯不是正解,但是顯然我們需要將各種點之間是否相連這個狀態給儲存下來,但是由題目可知,n<=200000,所以要是開二維陣列開滿的話起碼得要20萬*20萬的陣列,這個肯定是開不下的。所以這個時候又是stl上場的時候了,我們可以用vector來減少無用的空間。同時這個題目中所求的聯合權值的總和可以用加法結合律來優化(雖然聽起來很智障,但是用還是很好用的)。對於乙個節點來說,可以被看成是其相連兩個節點的中間點,假設有點s連著a,b,c,d四個點,所以對於s來說其聯合權值的總和為ab+ac+ad+bc+bd+cd,所以就是加法結合律了,等等,你可能會發現乙個東西,這怎麼用加法結合律。其實,以上這個式子是錯的,因為題目中有一句話講到一下幾個字,有!序!點!對!所以說,ac與ca都是要算一遍的,所以其實是,ab+ac+ad+ba+bc+bd+ca+cb+cd+da+db+dc,然後就是a*(b+c+d)+b*(a+c+d)+c*(a+b+d)+d*(a+b+c),(這個是不是乘法結合律?)所以我們可以看成a*(sum-a)+b*(sum-b)+c*(sum-c)+d*(sum-d),所以將每個節點邊上節點權值之和求出放在結構體中,這個問題就被大大地簡化了。
#includeusing namespace std;vector v[200001];
long long s[200001],w[200001],n,maxn,sum;
int main()
for (int i=1; i<=n; i++)
cin>>w[i];//w記錄點的權值
for (int i=1; i<=n; i++)//maxn1與maxn2分別為與i節點相連節點中第一和第二大的權值
else if (w[v[i][l]]==maxn1 || w[v[i][l]]>maxn2)
maxn2=w[v[i][l]];
}//隨時準備更新manx2
if (maxn1*maxn2>maxn)
maxn=maxn1*maxn2;
//maxn即為最大權值
} for (int i=1; i<=n; i++)b[mos<<1];
struct edgea[mos<<1];
bool mmp(edge a,edge b)
sort(a+1,a+(n<<1)-1,mmp);//將邊按照起點從小到大排序
for (int i=1; i<=n; i++)
b[i].ti+=b[i-1].ti;//求ti的字首和。
for (int i=1; i<=n; i++)
cin>>b[i].value;
for (int i=1; i<=n; i++)
else if (b[a[l].ed].value>b[i].second) b[i].second=b[a[l].ed].value;
} b[i].sum%=10007;
} for (int i=1; i<=n; i++)
} cout其中最迷離的應該是在point結構體中的ti變數了,ti所代表的意思即為b節點在邊中為起點的次數。其中最騷的就是這個ti的字首和了!看完這個**你就會發現呆滯大佬用ti的字首和解決了開無用陣列所造成的浪費,其中b[i].ti-b[i-1].ti-1就是在上乙個程式中的vector v.size(),這樣是墜騷滴。b[i].ti和a[b[i].ti]的關係就是不言而喻的,慢慢體會就會感覺……異常地騷。震驚!明天居然還要考試!
made by cain-
3728 聯合權值
無向連通圖g 有n 個點,n 1 條邊。點從1 到n 依次編號,編號為 i 的點的權值為w i 每條邊的長度均為1 圖上兩點 u v 的距離定義為u 點到v 點的最短距離。對於圖g 上的點對 u,v 若它們的距離為2 則它們之間會產生wu wv 的聯合權值。請問圖g 上所有可產生聯合權值的有序點對中...
聯合權值(link)
洛谷p1351 noip2014 day1 t2 無向連通圖 g 有 n 個點,n 1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為 w i 每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會...
聯合權值題解
無向連通圖 gg 有 n n 個點,n 1 role presentation style position relative n 1 n 1條邊。點從 1 1 到 n role presentation style position relative n n依次編號,編號為 i i 的點的權值為 ...