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 到...