企鵝遊行(最大流,拆點,列舉)

2022-06-08 14:33:10 字數 1234 閱讀 3557

將企鵝個數看作流量。

考慮轉移方式,如果兩塊浮冰之間距離在企鵝跳躍距離以內,那麼這兩塊浮冰之間就是可以互相轉移的,因此可以互相連容量是\(\infty\)的邊。

由於每塊浮冰都有跳躍次數限制,因此考慮拆點,拆成入點和出點,入點向出點連容量大小等於跳躍次數限制的邊。

設定虛擬源點\(s\),連向每塊浮冰,容量是每塊浮冰的企鵝個數。

列舉每塊浮冰作為匯點,跑最大流,若流量等於企鵝總數,則滿足條件。

#include #include #include #include #include #define x first

#define y second

using namespace std;

typedef pairpii;

const int n = 210, m = (100 + 100 + n * n) * 2, inf = 1e8;

const double eps = 1e-8;

int n, s, t;

double d;

int h[n], e[m], f[m], ne[m], idx;

int cur[n], d[n];

pii p[n];

void add(int a, int b, int c)

bool bfs()}}

return false;

}int find(int u, int limit)

}return flow;

}int dinic()

}return res;

}int main()

; add(s, i, a);

add(i, i + n, b);

tot += a;

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

int cnt = 0;

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

if(tot == dinic())

}if(!cnt) puts("-1");

else puts("");

}return 0;

}

hdu 4292 拆點 最大流)

思路 為了控制乙個人只連一瓶飲料,乙份食物,那麼我們可以把乙個人拆成兩個,他們之間連一條權值為1的邊,另外左邊連它喜歡的食物,權值為1,右邊連它喜歡的飲料,權值為1,在起點連食物的時候加流量限制,終點加流量限制,跑一遍最大流即可。1 include2 include3 include4 using ...

POJ 3498 拆點 最大流

大概題意 在南極的海洋上,有一些企鵝站在一些浮冰上,這些企鵝想聚在一塊,也就是到某塊浮冰上聚會,但是它們不想游泳,只想從一塊浮冰跳到另一塊上,自身的跳躍距離題中已經給出來了,然後是每個浮冰的座標,該浮冰上已經有個多少個企鵝,以及浮冰的承受能力,所謂承受能力不是指能載動多少企鵝,題目中說了每個浮冰載企...

POJ 3498 拆點 最大流

大概題意 在南極的海洋上,有一些企鵝站在一些浮冰上,這些企鵝想聚在一塊,也就是到某塊浮冰上聚會,但是它們不想游泳,只想從一塊浮冰跳到另一塊上,自身的跳躍距離題中已經給出來了,然後是每個浮冰的座標,該浮冰上已經有個多少個企鵝,以及浮冰的承受能力,所謂承受能力不是指能載動多少企鵝,題目中說了每個浮冰載企...