USACO10MAR 偉大的奶牛聚集

2022-05-07 19:21:11 字數 1423 閱讀 9445

因為是英文題,題目不再重複。。

給你一棵無根樹,每條邊有邊權,每個點有點權,要你選乙個點,使每個點到這個點的距離*點權的和最小,求這個值。

設dis[u]為u所有後代到它的距離*點權,sum[u]為u所有後代的點權和包括u

先以1為根dfs一遍,預處理出所有的dis,sum

然後問題就變成了更換這棵樹的根,維護dis,取所有根的dis的最小值。

所以再一次dfs,從u轉移到兒子v時,dis = dis[u] - f(邊權) * sum[v] + f * (sum[u] - sum[v])

常數巨大的醜陋**

# include 

# include

# include

# include

# include

using

namespace

std;

# define il inline

# define rg register

# define un unsigned

# define ll long long

# define rep(i, a, b) for(rg int i = a; i <= b; i++)

# define per(i, a, b) for(rg int i = b; i >= a; i--)

# define uev(e, u) for(rg int e = ft[u]; e != -1; e = edge[e].nt)

# define mem(a, b) memset(a, b, sizeof(a))

# define max(a, b) ((a) > (b)) ? (a) : (b)

# define min(a, b) ((a) < (b)) ? (a) : (b)

il int get()

const

int maxn = 100001, inf = 2147483647;

struct edge edge[maxn << 1];

int n, cnt, ft[maxn], w[maxn];

ll dis[maxn], ans = 1e18, sum[maxn];

il void add(rg int u, rg int v, rg int f); ft[u] = cnt++;

}il void dfs(rg int u, rg int fa)

}il void dfs2(rg int u, rg int fa, rg ll d, rg ll s)

}int main()

dfs(1, 0);

dfs2(1, 0, dis[1], sum[1]);

printf("%lld\n", ans);

return

0;}

P2986 USACO10MAR 偉大的奶牛聚集

題意 給一棵 n 個點的邊 點權樹,求帶權重 思路 其實這題和之前那個 sta 有點像,我們同樣只需要預處理出乙個f u 代表以 u 為集合點的方便程度,那麼我們就可以o 1 的轉移了 假設 v 是 u 的兒子,f v f u siz v len n siz v len f u n 2 siz v ...

usaco2013 mar 懶惰的奶牛

夏天又到了,奶牛貝里斯開始變得非常懶惰。他想要站在乙個地方,然後只走很少的一段路,就能吃到盡可能多的美味的青草。有n塊草坪排列在一條直線上,第i個草坪擁有g i數量的青草,第i個草坪所在的位置是x i。奶牛貝里斯想要在直線上選擇乙個點作為他的初始點 初始點有可能和草坪的位置重合 這樣他就能吃到以這個...

USACO5 4 奶牛的電信

傳送門 usaco5.4 奶牛的電信 農夫約翰的奶牛們喜歡通過電郵保持聯絡,於是她們建立了乙個奶牛電腦網路,以便互相交流。這些機器用如下的方式傳送電郵 如果存在乙個由c臺電腦組成的序列a1,a2,a ca 1,a 2,a c a1 a2 ac 且a 1a 1 a1 與a 2a 2 a2 相連,a 2...