LG P1361 小M的作物

2022-06-04 10:51:15 字數 1717 閱讀 2681

點這裡看題目。

經典的一類最小割問題。

首先不難確定問題的方向是最小割,以下我們認為 \(u\in s\) 表示種在 \(a\) 田, \(u\in t\) 表示種在 \(b\) 田。

考慮如果沒有合種的額外貢獻,我們可以對於每個點,連線 \(s\overset u\) 和 \(u\overset t\) 。

那麼此時有合種的貢獻,我們不妨先加到初始值,再考慮什麼時候會刪除。

由於在兩田的合種本質相似,所以我們只考慮在 \(a\) 田合種的貢獻。考慮給方案建立乙個節點 \(p\) ,那麼 \(p\in s\) 此時就可以看作是作物全部要種在 \(a\) 田;這就意味著如果 \(s\) 可以通過 \(p\) 和作物 \(u\) 到達 \(t\) 則不合法,因此需要保證此時只能割掉 \(u\rightarrow t\) 的邊,因此連線 \(p\overset u\) 。

\(b\) 田合種的情況相似操作即可。

小結:最小割的思考方式都很類似,都是構造邊使得不合法情況下邊會被割掉

這種建圖方式可以解決很多某些點需要屬於同一集合的要求。

#include typedef long long ll;

#define int ll

const int inf = 0x3f3f3f3f;

const int maxn = 2e5 + 5, maxm = 2e6 + 5;

templatevoid read( _t &x )

while( '0' <= s && s <= '9' )

x *= f;

}templatevoid write( _t x )

template_t min( const _t a, const _t b )

struct edge

graph[maxm << 1];

int q[maxn];

int a[maxn], b[maxn];

int head[maxn], dep[maxn], cur[maxn];

int n, k, cnt = 1, tot;

void addedge( const int from, const int to, const int c )

void adde( const int from, const int to, const int c )

bool bfs( const int s, const int t )

return dep[t] < inf;

}int dfs( const int u, const int lin, const int t )

} if( used < lin ) dep[u] = inf;

return used;

}int dinic( const int s, const int t )

return f;

}signed main()

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

if( a[i] > b[i] ) adde( s, i, a[i] - b[i] ), ans += a[i];

else adde( i, t, b[i] - a[i] ), ans += b[i];

write( ans - dinic( s, t ) ), putchar( '\n' );

return 0;

}

P1361 小M的作物

p1361 小m的作物 二者取其一型別的網路流題 不同的集合,向對應元素連去不同 收益 容量的邊 對於那些神奇的組合,我們只需要按照以下方式建立兩個點 x 向 s 連一條在a時的額外收益 2.x x 注意順序,x 是其有向邊的起點,x 是其有向邊的終點 向其後繼節點連 inf 容量的邊,保證不會出現...

P1361 小M的作物

小m在mc裡開闢了兩塊巨大的耕地a和b 你可以認為容量是無窮 現在,小p有n中作物的種子,每種作物的種子有1個 就是可以種一棵作物 用1.n編號 現在,第i種作物種植在a中種植可以獲得ai的收益,在b中種植可以獲得bi的收益,而且,現在還有這麼一種神奇的現象,就是某些作物共同種在一塊耕地中可以獲得額...

洛谷 P1361 小M的作物

有 nn n 種作物,兩塊耕地 a aa 和 bbb 第 i ii 種作物種植在 a aa 中收益為 a ia i ai 種植在 b bb 中收益為 b ib i bi 另有 m mm 種組合,每種組合有 k kk 種作物,如果這 k kk 種作物共同種在 a aa 中收益為 c1i c1 i c1...