题目大概说有n男n女,男的每回合要和不同女的跳舞,男女都有自己喜欢一起跳舞的对象,他们最多能容忍和k个不喜欢的人跳舞,问舞会最多能进行几个回合。

二分枚举回合用最大流判断:男和女各拆成两点i、i'和j、j',中间连容量k的边;源点向i连容量为回合数的边,j'向汇点连容量回合数的边;如果i和j是喜欢关系则i向j'连容量1的边,否则i'向j连容量1的边;跑最大流,如果结果等于n*回合数则成立。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<queue>
  4 #include<algorithm>
  5 using namespace std;
  6 #define INF (1<<30)
  7 #define MAXN 444
  8 #define MAXM 444*888
  9
 10 struct Edge{
 11     int v,cap,flow,next;
 12 }edge[MAXM];
 13 int vs,vt,NE,NV;
 14 int head[MAXN];
 15
 16 void addEdge(int u,int v,int cap){
 17     edge[NE].v=v; edge[NE].cap=cap; edge[NE].flow=0;
 18     edge[NE].next=head[u]; head[u]=NE++;
 19     edge[NE].v=u; edge[NE].cap=0; edge[NE].flow=0;
 20     edge[NE].next=head[v]; head[v]=NE++;
 21 }
 22
 23 int level[MAXN];
 24 int gap[MAXN];
 25 void bfs(){
 26     memset(level,-1,sizeof(level));
 27     memset(gap,0,sizeof(gap));
 28     level[vt]=0;
 29     gap[level[vt]]++;
 30     queue<int> que;
 31     que.push(vt);
 32     while(!que.empty()){
 33         int u=que.front(); que.pop();
 34         for(int i=head[u]; i!=-1; i=edge[i].next){
 35             int v=edge[i].v;
 36             if(level[v]!=-1) continue;
 37             level[v]=level[u]+1;
 38             gap[level[v]]++;
 39             que.push(v);
 40         }
 41     }
 42 }
 43
 44 int pre[MAXN];
 45 int cur[MAXN];
 46 int ISAP(){
 47     bfs();
 48     memset(pre,-1,sizeof(pre));
 49     memcpy(cur,head,sizeof(head));
 50     int u=pre[vs]=vs,flow=0,aug=INF;
 51     gap[0]=NV;
 52     while(level[vs]<NV){
 53         bool flag=false;
 54         for(int &i=cur[u]; i!=-1; i=edge[i].next){
 55             int v=edge[i].v;
 56             if(edge[i].cap!=edge[i].flow && level[u]==level[v]+1){
 57                 flag=true;
 58                 pre[v]=u;
 59                 u=v;
 60                 //aug=(aug==-1?edge[i].cap:min(aug,edge[i].cap));
 61                 aug=min(aug,edge[i].cap-edge[i].flow);
 62                 if(v==vt){
 63                     flow+=aug;
 64                     for(u=pre[v]; v!=vs; v=u,u=pre[u]){
 65                         edge[cur[u]].flow+=aug;
 66                         edge[cur[u]^1].flow-=aug;
 67                     }
 68                     //aug=-1;
 69                     aug=INF;
 70                 }
 71                 break;
 72             }
 73         }
 74         if(flag) continue;
 75         int minlevel=NV;
 76         for(int i=head[u]; i!=-1; i=edge[i].next){
 77             int v=edge[i].v;
 78             if(edge[i].cap!=edge[i].flow && level[v]<minlevel){
 79                 minlevel=level[v];
 80                 cur[u]=i;
 81             }
 82         }
 83         if(--gap[level[u]]==0) break;
 84         level[u]=minlevel+1;
 85         gap[level[u]]++;
 86         u=pre[u];
 87     }
 88     return flow;
 89 }
 90 int n,m,k;
 91 bool G[111][111];
 92 //vs i i+n i+2*n i+3*n vt
 93 bool isok(int t){
 94     vs=0; vt=n*4+1; NV=vt+1; NE=0;
 95     memset(head,-1,sizeof(head));
 96     for(int i=1; i<=n; ++i){
 97         addEdge(vs,i,t);
 98         addEdge(i,i+n,k);
 99         addEdge(i+2*n,i+3*n,k);
100         addEdge(i+3*n,vt,t);
101     }
102     for(int i=1; i<=n; ++i){
103         for(int j=1; j<=n; ++j){
104             if(G[i][j]) addEdge(i,j+3*n,1);
105             else addEdge(i+n,j+2*n,1);
106         }
107     }
108     return ISAP()==t*n;
109 }
110 int main(){
111     int t,a,b;
112     scanf("%d",&t);
113     while(t--){
114         scanf("%d%d%d",&n,&m,&k);
115         memset(G,0,sizeof(G));
116         while(m--){
117             scanf("%d%d",&a,&b);
118             G[a][b]=1;
119         }
120         int l=0,r=n;
121         while(l<r){
122             int mid=l+r+1>>1;
123             if(isok(mid)) l=mid;
124             else r=mid-1;
125         }
126         printf("%d\n",l);
127     }
128     return 0;
129 }

转载于:https://www.cnblogs.com/WABoss/p/5351424.html

HUST1024 dance party(最大流)相关推荐

  1. BZOJ 1305 dance跳舞(最大流+二分答案)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1305 解题思路: 转自:https://blog.csdn.net/u012288458 ...

  2. BZOJ ac100题存档

    不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...

  3. BZOJ 1305 dance跳舞 二分+最大流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1305 题目大意: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成 ...

  4. 【BZOJ - 1305】dance跳舞(拆点网络流,建图,最大流,残留网络上跑最大流)

    题干: 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会"单向 ...

  5. 牛客 - Dance with a stick(大风车模型)

    题目链接:点击查看 题目大意:二维平面给出 nnn 个点,满足任意三个点不在一条直线上.需要选出一条经过某个点的有向直线,满足执行 "大风车" 后直线的角度反转到 18018018 ...

  6. spotify 数据分析_我的Spotify流历史分析

    spotify 数据分析 Spotisis /spo-ti-sis/ noun The analysis of one's Spotify streaming history using Python ...

  7. BZOJ1305 [CQOI2009]dance跳舞 【网络流】

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 3714  Solved: 1572 [Submit][ ...

  8. 【26天高效学习Java编程】Day22:Java中的属性集-缓冲流-转换流-序列化流详解

    本专栏将从基础开始,循序渐进,由浅入深讲解Java的基本使用,希望大家都能够从中有所收获,也请大家多多支持. 专栏地址:26天高效学习Java编程 相关软件地址:软件地址 所有代码地址:代码地址 如果 ...

  9. bzoj1305【CQOI2009】dance 跳舞

    1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec   Memory Limit: 162 MB Submit: 2041   Solved: 853 [ Submit ...

最新文章

  1. BCH易于使用不只是说说而已
  2. setdiff--求两个集合的差
  3. sql计算留存_链家面试题:如何分析留存率?
  4. 地址总线与内存大小的关系(待续…)
  5. php ci post 请求,CI框架中判断post,ajax,get请求的方法
  6. axis2开发webservice之编写Axis2模块(Module)
  7. docker php nginx,docker 构建nginx + php
  8. layui弹出层:皮肤扩展(文档解读)
  9. 美国防部DARPA发起地下空间挑战赛提供3百万美元巨奖
  10. UI设计为什么要使用Figma?
  11. 手把手教你做一套 UTM 广告投放!| 原力计划
  12. python及拓展版_python扩展模块
  13. 重复类发展手法_正确护肤手法图解!
  14. 计算机ppt闪耀效果在哪里,ppt怎样制作文字闪烁效果
  15. JButton与Button的区别
  16. UE5打包失败:AutomationTool exiting with ExitCode=-532462766 解决方法
  17. Android Clean 架构浅析
  18. JIRA实践基础(1):JIRA-Software安装与设定
  19. 【期末复习笔记】知识产权法——著作权、专利法、商标权
  20. 电脑C盘满了有什么影响?如何正确清理C盘?

热门文章

  1. Linux下如何简单删除/data的空目录
  2. what you should do if you want to exercise?
  3. put the eye care sticker on the neck is relief
  4. house price model
  5. 每次digital painting 之后,都可以把作品放到这里,比较好看,也和nft相关度比较大
  6. GC-ALLOC 的另一个重要作用,查内存泄漏
  7. c# LUA 互通,相关资料收集
  8. XebiaLabs DevOps平台推出软件发布风险和合规性管理功能
  9. Spring_JDBC连接
  10. 工信部副部长刘利华:推动5G全球统一标准 加强国际合作