codevs 3728 聯合權值
題目描述
無向連通圖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 上聯合權值的最大值
和所有聯合權值之和。由於所有聯合權值之和可能很大,[b]輸出它時要對10007 取餘。
輸入輸出樣例
輸入樣例 1:
5 1 2
2 3
3 4
4 5
1 5 2 3 10
輸出樣例 1:
思路:首先60應該是很好拿的,去找每個點相距為2的點算就是了。
100分的話我們可以考慮兩個距離為2得點可以看做乙個點的兩個孩子的距離,而權值總和可以看做各個點的不同的兩個孩子的權值之積。
某個點的最大權值為其最大和次大孩子的權值之積,而權值之和和話我們可以考慮對於任意個數,兩兩相乘的乘積之和就等於這些數的和的平方減去平方的和。2*(u*v)=(u+v)^2-u^2-v^2。
60分**
#include
#include
#include
#include
using
namespace
std;
const
int maxn=400000+10;
int mod=10007;
struct cces[maxn];
int first[maxn],next[maxn];
int tot=0;
void build(int ff,int tt)
; next[tot]=first[ff];
first[ff]=tot;
}int s[maxn];
int ans=0,sum=0;
void dfs(int x,int now,int step)
for(int i=first[now];i;i=next[i])
}}int main()
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
printf("%d %d",ans,sum);
return
0;}
100分題解:
#include
#include
#include
#include
using namespace std;
const int maxn=400000+10;
const int mod=10007;
struct cces[maxn];
int first[maxn],next[maxn];
int tot=0;
void build(int ff,int tt)
; next[tot]=first[ff];
first[ff]=tot;
} int
s[maxn];
int main()
for(int i=1;i<=n;i++)
int ans1=0,ans2=0;
for(int i=1;i<=n;i++)
else
if(s[u]>max2)
}ans1=max(ans1,max1*max2);
ans2=(ans2+sum1*sum1-sum2+mod)%mod;
}printf("%d
%d",ans1,ans2);
return
0;}
NOIP2014提高組 聯合權值
傳送門 無向連通圖 g 有 n 個點,n 1 條邊。點從 1 到 n 依次編號,編號為 i 的點的權值為 wi,每條邊的長度均為 1。圖上兩點 u,v 的距離定義為 u 點到 v 點的最短距離。對於圖 g 上的點對 u,v 若它們的距離為 2,則它們之間會產生wu wv的聯合權值。請問圖 g 上所有...
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...