Luogu2792 JSOI2008 小店購物

2022-05-16 10:15:29 字數 1320 閱讀 4229

luogu2792 [jsoi2008]小店購物

重題 bzoj4349 最小樹形圖

有 \(n\) 個物品,每個物品有** \(c_i\) 和所需個數 \(k_i\) ,所有物品必須恰好買 \(k_i\) 個。有 \(m\) 種優惠方案給出 \(x,\ y,\ w\) :若買過至少一件 \(x\) 物品,則 \(y\) 物品只需 \(w\) 的** \((w,資料中所有 \((x,\ y)\) 不同且 \(x\neq y\) 。求最少花費。所有資料保留兩位小數。

\(1\leq n\leq50,\ 0

最小樹形圖

首先判掉無效的 \(k_i=0\) 的物品,發現如果每種物品都買過一遍,那麼隨後所有的商品都可以以最低**購買。那麼如何求每種物品各買乙個的最小花費呢?可以將 \(m\) 種優惠方案看做樹邊,再加乙個虛擬節點 \(n+1\) ,連邊 \((n+1,\ i,\ c_i)\) ,接著跑最小樹形圖就可以解決了

因為 \(m\) 是 \(n^2\)級別的,所以時間複雜度 \(o(n^3)\)

**

#include using namespace std;

typedef double db;

const int maxn = 60;

int n, m, mp[maxn], sum[maxn], pre[maxn], vis[maxn], tid[maxn]; db ans, a[maxn], val[maxn];

struct edges e[maxn * maxn];

db edmonds()

for (int i = 1; i <= m; i++)

}int tot = 0;

for (int i = 1; i < n; i++)

if (!tid[u] && u != rt) }}

if (!tot) break;

for (int i = 1; i <= n; i++)

for (int i = 1; i <= m; i++)

rt = tid[rt], n = tot;

} return ans;

}int main()

scanf("%d", &t2);

m = n + t2, n++;

for (int i = 1; i < n; i++)

for (int i = 1; i <= t2; i++)

for (int i = 1; i <= n; i++)

printf("%.2f", edmonds());

return 0;

}

Luogu1197 JSOI2008 星球大戰

並查集水過。想必順著題意只能暴力了,因為涉及到拆點很麻煩 所以我們反著來 笑 仔細想想,反著來不就是建點了嗎 233 於是並查集判斷聯通塊,ok大功告成 eg 那個資料範圍是真的坑!1 n 2m 硬生生看成 1 m 2n 60分re了半天.include include const int maxn...

Luogu5234 JSOI2012 越獄老虎橋

題面 洛谷 題意中的要求即為割掉權值最小的割邊,所以先把圖縮點 這裡應該是邊雙連通分量 現在考慮增加一條邊會對縮點後的樹造成什麼影響,無非是成環,然後環上的邊不能割掉。現在考慮貪心,從小到大加邊,若這些邊在一條鏈上,就繼續,反之輸出答案,用 lca 維護即可,注意特判。luogu judger en...

Luogu食物鏈做法2

這個題的做法2比做法1好想 以下距離都在 mod 3意義下 到最後所有動物的關係可以用樹表示,d i 表示節點i到當前fa i 的距離,我們規定若d x 1 d y 規定成 1也可以 代表x吃y 那麼如果x y同族,那麼如果規定x當前祖先到y當前距離為的d y d x 這樣x到y祖先距離為d x 到...