題目鏈結
不了解的可以先自行學習一下,這裡簡略的講一下最大權閉合子圖演算法解決的問題。
最大權閉合子圖大概講的是求一種依賴圖的最大權值。如果乙個點選了,那麼它的依賴點也必須選。讓你選擇乙個滿足依賴關係的子集,使得權值最大。
首先如果種類為x的壽司吃了c(c
>0)
c(c>0)
c(c>0)
個,要付出的代價是mx2
+cxmx^2 + cx
mx2+cx
。我們建立乙個種類節點,這個節點的代價是mx2
mx^2
mx2。每個種類為x的壽司向這個點建立依賴邊。這樣當c
>
0c>0
c>
0時,這個點必定被選擇。同時,每個壽司的代價是x
xx,這樣就解決了cxcx
cx的問題。
其次每次必須選擇連續區間,如果[l,
r][l,r]
[l,r
]區間的壽司被選擇了,那麼會獲得ql,
rq_ql,r
的美味度。顯然,如果某兩次選的區間有交集,我們可以合併為一次。然後我們分兩種情況:如果l=r
l=rl=
r,那麼ql,
rq_ql,r
依賴第l
ll個壽司。如果l!=
rl!=r
l!=r
,那麼ql,
rq_ql,r
依賴ql+
1,rq_
ql+1,r
和ql,r
−1q_ql
,r−1
。我們可以根據題意建立依賴圖模型,並通過最大權閉合子圖演算法將依賴圖最大權問題轉化為最大流問題加以解決。
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int n =
1e5+
100;
const ll inf =
1e16
;struct edge
edge
(int to, ll cap,
int rev):to
(to)
,cap
(cap)
,rev
(rev)};
vector g[n]
;int iter[n]
, level[n]
;void
addedge
(int from,
int to, ll cap)
void
bfs(
int s)}}
}ll dfs
(int u,
int t, ll f)}}
return0;
}ll max_flow
(int s,
int t)
}int n, m, tot, tp;
int sa[
110]
, has[
110]
, id[
110]
[110
], w[
110]
[110];
intmain()
} ll s =
++tot, t =
++tot, res =0;
for(
int i =
1; i <= tp; i++
)addedge
(i, t,
1ll* m * has[i]
* has[i]);
for(
int i =
1; i <= n; i++
)for
(int i =
1; i <= n; i++
)else
addedge
(id[i]
[j], t,
-w[i]
[j]);if
(i == j)
addedge
(id[i]
[j], tp + i, inf)
;else}}
printf
("%lld\n"
, res -
max_flow
(s, t));
return0;
}
51nod 貪心入門
有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...
51nod 迷宮問題
1459 迷宮遊戲 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的...
51nod 硬幣遊戲
有乙個簡單但是很有趣的遊戲。在這個遊戲中有乙個硬幣還有一張桌子,這張桌子上有很多平行線 如下圖所示 兩條相鄰平行線之間的距離是1,硬幣的半徑是r,然後我們來拋硬幣到桌子上,拋下之後硬幣有時候會和一些直線相交 相切的情況也算是相交 有時候不會。請你來計算一下拋一次硬幣之後,該硬幣和直線相交數目的期望。...