[CQOI2009]跳舞
link
一道网络流建模题目,挺基础的,但由于本人世面见得太少(说白了就是题做得太少),考场上没有看出来它是一个网络流。这道题目让我知道了看似和网络流搭不上边的题目竟然也可以用它来解决,啊世界奇妙。
说回这道题。由于题目要求每个人在每一局舞会中都不能袖手旁观,所以我们需要找出一个匹配使得每个人都恰好有m个人为伴,这是基础条件,不满足就不合法。原因嘛,很容易想到假如每个人都有刚好那么多个舞伴,一定可以构造出一种顺序使得每个人每一局都不再孤单。而恰好这个词需要上界和下界来限制(差分约束系统吗……),上界可以考虑给每个人从源点连的边的流量上界来体现,下界就直接看最大流有没有把它跑满。但这样一来我们就只能做到对一个可能答案的检查,于是就可以想到用二分答案来解决。虽然此题数据范围小到二分答案似乎并没有什么卵用。
至于限制不喜欢的人数,可以用拆点的思想处理,把每个人分裂成喜欢和不喜欢两部分分别连接,两个点连到一个公共点,共用流量上界即可。
#include
#include
#define zczc
using namespace std;
const int N=55;
const int maxn=1e9;
inline void read(int &wh){
wh=0;int f=1;char w=getchar();
while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
while(w>='0'&&w<='9'){wh=wh*10+w-'0';w=getchar();}
wh*=f;return;
}
inline int min(int s1,int s2){
return s1>1)?l=mid:r=mid-1;
printf("%d\n",l);
return 0;
}