將企鵝個數看作流量。
考慮轉移方式,如果兩塊浮冰之間距離在企鵝跳躍距離以內,那麼這兩塊浮冰之間就是可以互相轉移的,因此可以互相連容量是\(\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 拆點 最大流
大概題意 在南極的海洋上,有一些企鵝站在一些浮冰上,這些企鵝想聚在一塊,也就是到某塊浮冰上聚會,但是它們不想游泳,只想從一塊浮冰跳到另一塊上,自身的跳躍距離題中已經給出來了,然後是每個浮冰的座標,該浮冰上已經有個多少個企鵝,以及浮冰的承受能力,所謂承受能力不是指能載動多少企鵝,題目中說了每個浮冰載企...