描述
無向連通圖 g 有 n 個點,n-1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為 wiwi, 每條邊的長度均為 1。圖上兩點(u, v)的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對(u, v),若它們的距離為 2,則它們之間會產生wuwu×wvwv的聯合權值。
請問圖 g 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少?
格式 輸入格式
第一行包含 1 個整數 n。
接下來 n-1 行,每行包含 2 個用空格隔開的正整數 u、v,表示編號為 u 和編號為 v 的點 之間有邊相連。
最後 1 行,包含 n 個正整數,每兩個正整數之間用乙個空格隔開,其中第 i 個整數表示 圖 g 上編號為 i 的點的權值為wiwi。
輸出格式
輸出共 1 行,包含 2 個整數,之間用乙個空格隔開,依次為圖 g 上聯合權值的最大值 和所有聯合權值之和。由於所有聯合權值之和可能很大,輸出它時要對10007取餘。
樣例1
樣例輸入1[複製]
5 1 2
2 3
3 4
4 5
1 5 2 3 10
樣例輸出1[複製]
20 74
限制 對於 30%的資料,1 < n ≤ 100;
對於 60%的資料,1 < n ≤ 2000;
對於 100%的資料,1 < n ≤ 200,000,0 < wiwi ≤ 10,000。
【題解】
設w[a]+w[b]+w[c]+w[d]=sum[e]
則這個圖的答案就是w[a](sum[e]-w[a])+w[b](sum[e]-w[b])+….
這樣只要列舉n-1條邊就能算出總的權值了;
最大權值只要求出和上圖中c相鄰的點中w的值最大和次大的就好;
要求出每個點的次大和最大;
然後取它們乘積的最大值;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ll long long
using
namespace
std;
const
int maxn = 2e5+100;
const
int mod = 10007;
const
int dx[5] = ;
const
int dy[5] = ;
const
double pi = acos(-1.0);
struct bian
;struct abc
;int n;
bian b[maxn];
int w[maxn],sum[maxn];
abc c[maxn];
void input_ll(ll &r)
void input_int(int &r)
int main()
else
if (w[y]>c[x].max2)
c[x].max2 = w[y];
if (w[x]>c[y].max1)
else
if (w[x]>c[y].max2)
c[y].max2 = w[x];
}int ans1 = c[1].max1*c[1].max2;
for (int i = 2;i <= n;i++)
if (c[i].max1*c[i].max2>ans1)
ans1 = c[i].max1*c[i].max2;
int ans2 = 0;
for (int i = 1;i <= n-1;i++)
printf("%d %d\n",ans1,ans2);
return
0;}
D Zigzags(計數 字尾和,1900)
題意 給你乙個長度不超過3000的陣列a,計算 i,j,k,l 的數量,其中滿足a i a k a j a l 思路 從後到前列舉k,並且記錄每個數字出現的次數字尾和,再從k開始向前列舉i,並且每列舉乙個i 就對這一段中維護答案,最後碰到a i a k 的情況,就統計答案。include pragm...
csuoj 1900 鋒芒畢露
輸入包含不超過10組資料。對於每組資料,第一行乙個整數n 1 n 100000 表示小閃前後共收集到了n對雙劍 接下來n行,每行包含兩個整數a和b 1 a,b 100 分別表示每次小閃收集到的一對劍的左手用劍和右手用劍的攻擊力數值。每組資料之後會有乙個空行。輸入以一行乙個整數0結束。對於每組資料,輸...
關閉123埠和1900埠的方法
udp123 這個埠經常會被蠕蟲病毒入侵系統,所以應該關閉此埠,方法如下 開始 設定 控制面板 管理工具 服務,windows time 右鍵屬性停止然後禁用 udp1900埠 關閉udp1900埠可以防止ddos攻擊,此埠也找到 ssdp discovery service,同樣辦法將其關閉.19...