標籤:最小割,網路流
題目傳送門
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加二分優化 我太鹹啦 好在總複雜度還是...