bzoj 1305: [CQOI2009]dance跳舞
题目链接
题解
男,女生拆点A1A2,B1B2,拆成两点间分别连容量为K的边,限制与不喜欢的人跳舞的数量
A1连接源点容量为x,B1连接汇点容量为x,x即为歌曲数目数
对与相互喜欢的男女直在A1,B1间接连容量为1的边
对于相互不喜欢A2练到B2,容量为1
二分x的大小,每次重新构图,判断该图是否满流,慢流则说明该曲目可行
代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10007;
#define INF 0x7fffffff
using std::queue;
inline int read() {
    int x=0;
    char c=getchar();
    while(c<'0'||c>'9') c=getchar();
    while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar();
    return x;
}
int head[maxn];
int n,m,num=0,S,T;
int bel[maxn];
struct node{
    int v,next,flow;
}edge[maxn<<4];
void add_edge(int u,int v,int flow) {
    edge[++num].v=v;edge[num].flow=flow;edge[num].next=head[u];head[u]=num;
    edge[++num].v=u;edge[num].flow=0;edge[num].next=head[v];head[v]=num;
}
int cur[maxn],lev[maxn];
bool bfs() {
    memset(lev,-1,sizeof lev);
    memcpy(cur,head,sizeof head);
    queue<int>que;
    que.push(S);lev[S]=0;
    while(!que.empty()) {
        int u=que.front();que.pop();
        for(int i=head[u];i;i=edge[i].next) {
            int v=edge[i].v;
            if(edge[i].flow>0&&lev[v]<0) {
                lev[v]=lev[u]+1;que.push(v);
            }
        }
    }
    if(lev[T]!=-1)return true;
    else return false;
}
int dfs(int now,int flow) {
    if(now==T)return flow;
    int rest=0,delta;
    for(int &i=cur[now];i;i=edge[i].next) {
        int v=edge[i].v;
        if(lev[v]==lev[now]+1&&edge[i].flow>0) {
            delta=dfs(v,min(flow-rest,edge[i].flow));
            if(delta) {
                edge[i].flow-=delta;
                edge[i^1].flow+=delta;
                rest+=delta;if(rest==flow)break;
            }
        }
    }
    if(rest==flow)lev[now]=-1;
    return rest;
}
int dinic() {
    int ans=0;
    while(bfs())
         ans+=dfs(S,INF);
    return ans;
}
int main() {
    n=read(),m=read();
    T=n+1;
    for(int p,i=1;i<=n;++i) {
        p=read();
        if(p==1)add_edge(S,i,1),bel[i];
        else add_edge(i,T,1);
    }
    for(int a,b,i=1;i<=m;++i) {
        a=read(),b=read();
        add_edge(a,b,2);
        add_edge(b,a,2);
    }
    printf("%d\n",dinic());
    return 0;
}
												
											bzoj 1305: [CQOI2009]dance跳舞的更多相关文章
- BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
		
1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...
 - BZOJ 1305: [CQOI2009]dance跳舞( 最大流 )
		
云神代码很短...0 ms过的...看了代码 , 大概是贪心... orz 我不会证 数据这么小乱搞就可以了吧... ←_← 这道题网络流还是可以写的... 既然限制了最多只能和 k 个不喜欢的人da ...
 - BZOJ 1305 [CQOI2009]dance跳舞(二分+网络流)
		
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1305 [题目大意] 一次舞会有n个男孩和n个女孩. 每首曲子开始时,所有男孩和女孩恰好 ...
 - BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模
		
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
 - BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流
		
题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...
 - bzoj 1305: [CQOI2009]dance 二分+網絡流判定
		
1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 1340 Solved: 581[Submit][Sta ...
 - 1305: [CQOI2009]dance跳舞 - BZOJ
		
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
 - 1305: [CQOI2009]dance跳舞
		
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4169 Solved: 1804[Submit][Status][Discuss] Descripti ...
 - BZOJ 1305:dance跳舞(二分+最大流)
		
一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩 ...
 
随机推荐
- Python 基础学习篇
			
注:技术尚浅,时间匆忙,如有错误或者不当之处值得商榷的,请留言,吾必思而改之. 第一篇 :Python基础- 安装/变量/输入/及循环语句使用 第二篇: Python基础- 常用数据类型 第三篇: ...
 - diskimage-builder
			
Supported Distributions Distributions which are supported as a build host: Centos 6, 7 Debian 8 (“je ...
 - 第一次软件工程作业补充plus
			
一.代码的coding地址:coding地址. 二.<构建之法>读后问题以及感言(补充): 1.对于7.3MSF团队模型,7.2.6保持敏捷,预期和适应变化,中的"我们是预期变化 ...
 - POJ 2983-Is the Information Reliable
			
Description The galaxy war between the Empire Draco and the Commonwealth of Zibu broke out 3 years a ...
 - 再探 KMP 算法
			
$\DeclareMathOperator{\fail}{fail}$ KMP 算法堪称经典中的经典,然而这么多年以来,我却未能完全理解这个算法.我对 KMP 算法掌握的程度,是知其原理,但写不出来. ...
 - Spring Boot Executable jar/war 原理
			
spring boot executable jar/war spring boot里其实不仅可以直接以 java -jar demo.jar的方式启动,还可以把jar/war变为一个可以执行的脚本来 ...
 - POJ 3041 Asteroids | 匈牙利算法模板
			
emmmmm 让你敲个匈牙利 #include<cstdio> #include<algorithm> #include<cstring> #define N 51 ...
 - BZOJ1800 [Ahoi2009]fly 飞行棋  【枚举】
			
题目 给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列. 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形. 输入格式 第一行为正整数N,表示点的个 ...
 - Problem b
			
Problem b 题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入 第一行一个整数 ...
 - atan 和 atan2
			
转自http://blog.csdn.net/chinabinlang/article/details/6802686 atan函数与atan2函数的一点区别 . atan 和 atan2 都是求反 ...