LOJ6045 雅禮集訓 2017 Day8 價

2021-08-14 07:02:45 字數 1393 閱讀 1768

標籤:最小割,網路流

題目傳送門

30分——爆搜

40分——加乙個特判(全部取)(因為pi小於0)

正解:

最小割建圖:

源點s向每個**藥連一條流量為pi+inf的邊

**藥向其對應的藥材連一條流量為inf的邊

每個藥材向匯點t連一條流量為inf的邊

然後跑dinic

因為存在負邊權,那麼要加入sum計算進入**藥的總流量,然後輸出maxflow(ans)-sum即可

因為二分圖有完美匹配,這表示左邊任選k個點,右邊都有至少k個點與之相鄰, 所以不會出現得到的收益超過inf的情況

#include

#include

#include

#include

#include

#include

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

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

#define ll long long

#define mem(x,num) memset(x,num,sizeof x)

#define reg(x) for(int i=last[x];i;i=e[i].next)

#define inf 1000000000

using

namespace

std;

inline ll read()

while(ch>='0'&&ch<='9')

return x*f;

}const

int maxn=606,maxm=5e5+6;

int n,x,y,s,t,last[maxn],que[maxm],h[maxm],cnt=1;

int sum=0,ans=0;

struct edgee[maxm];

void insert(int u,int v,int w);last[u]=cnt;

e[++cnt]=(edge);last[v]=cnt;

}bool bfs()

}return h[t]!=-1;

}int dfs(int x,int f)

if(!used)h[x]=-1;

return used;

}void dinic()

int main()

}rep(i,1,n)insert(i+n,t,inf);

rep(i,1,n)

dinic();

cout

0;}

loj6045 雅禮集訓 2017 Day8 價

我們考慮最小割。我一開始覺得是裸的最小割,就直接s到每個 藥連up p i 的邊,藥到藥材連inf邊,藥材到t連up,然後得到了40分的好成績。之後我發現這是乙個假的最小割,最小割割的是代價或者得不到的收益,上面說的這種建圖左邊割掉的是收益,右邊割掉的是代價,然後當然就gg了。所以我們把p取相反數,...

雅禮集訓 2017 價

傳送門 乙個不太顯然的最小割做法。我們這麼連邊 源點向藥物連 infty p i 容量的邊,藥物向它對應的藥材連 infty 容量的邊,藥材向匯點連 infty 容量的邊。用源點的流量減去最小割,再負回來就可以求出答案了。怎麼理解呢?割掉一條邊表示不選其對應的藥物或藥材,我們發現最後的方案一定是完美...

2017國慶雅禮集訓 長沙雅禮划水記

一題給出數軸上 n 個座標xi 有權值w i 求由 x i xj wi wj 連邊構成的最大團。這個式子長得太像兩圓相離或外切的表示了 連數軸都告訴你了呀 於是瞬間變成取最多不重區間的水題。然而我居然忘了還有右端點排序後o n 的簡單貪心,寫了個o n2 的dp加二分優化 我太鹹啦 好在總複雜度還是...