B.wyh2000 and pupil

题意是将彼此不认识的人分两组,第一组尽可能人数最多,并且每组至少有一个人,如果不能分成两组则输出”Poor wyh”
这个是二分图,将人分成两组,首先构成图,如
G[1]={ 2 3 4 5},即1与2,3,4,5 不认识
1. 还未分组的先放到第group组,用dfs(i,group(1 or 2)),再枚举与i不认识的人
2.已分组的判断是否有冲突,还未分组则递归执行上一步骤,此时group=3-group

#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
using namespace std;
const int N=100005;
int f[N];   //标记分组
int cnt[3];   //计算每组人数
vector<int>G[N]; //记录
bool dfs(int u,int gr)   //dfs找增广路
{f[u]=gr;     //标记组cnt[gr]++;   for(int i=0;i<G[u].size();i++){ //枚举int v=G[u][i];if(f[v]!=-1){               //若已分组if(f[v]!=(3-gr)) return false;}else if(!dfs(v,3-gr)) return false;  //未分组}return true;
}
void work(int n)
{int ans=0;int s1=0;int s2=0;memset(cnt,0,sizeof cnt);memset(f,-1,sizeof f);for(int i=1;i<=n;i++){int c1=cnt[1];int c2=cnt[2];if(f[i]<0){         //未分组if(!dfs(i,1)){puts("Poor wyh");return;}//printf("c1=%d c2=%d cnt1=%d cnt2=%d\n",c1,c2,cnt[1],cnt[2]);s1+=max(cnt[1]-c1,cnt[2]-c2);  //将每次增加人数最多的加到s1s2+=min(cnt[1]-c1,cnt[2]-c2);//  printf("s1=%d s2=%d\n",s1,s2);}}//ans=cnt[1]>cnt[2]?cnt[1]:cnt[2];if(s2==0) s1--,s2++;printf("%d %d\n",s1,s2);
}
int main()
{  int T;scanf("%d",&T);while(T--){int n,m;int x,y;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)G[i].clear();for(int i=0;i<m;i++){scanf("%d%d",&x,&y);G[x].push_back(y);G[y].push_back(x);}if(n<2){puts("Poor wyh");continue;}work(n);}return 0;
}

其实一开始觉得只要找到各个分组的人数就是了,后来发现并不是的
比如这一组:
2
6 4
1 2
1 3
2 4
4 5
正确应为:4 2
但如果只找各个组人数就是:3 3
模拟一下就知道了

hdu5385 wyh2000 and pupil 二分图相关推荐

  1. 【hdu5285】wyh2000 and pupil

    今天下午的二分图染色给我开启新世界的大门啊2333333 这个题要比刚才的关押罪犯简单,只需要染一遍色就能求出答案 #include<iostream> #include<cstri ...

  2. POJ - 3041 Asteroids 二分图最小点覆盖

    题目链接 二分图一个很重要的定理:看了很多大神的博客表示看不懂为什么,以后再看 最小点覆盖=最大匹配 最小点覆盖就是在二分图里边,选择一个点,将所有与该点相链接的边删去,问最小找多少个点能够把所有的边 ...

  3. P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖

    二分图最小不相交路径覆盖 #include<bits/stdc++.h> using namespace std; const int MAXN = 5550; const int MAX ...

  4. 图论:关于二分图的总结(转载)

    二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y. 最大匹配:图中包含边数最多的匹配称为图的最大匹配. 完美匹配:如果所有点都在匹配边 ...

  5. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

  6. Dinic二分图匹配 || Luogu P3386

    题面:[模板]二分图匹配 思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2 然后S去和N中的数建正边和反边,正边权值为1,反边权值为0:M中的数去 ...

  7. [THUWC2017]随机二分图

    题目大意 给一张二分图,有左部点和右部点. 有三种边,第一种是直接从左部点连向右部点,出现概率为50%. 第二种边一组里有两条边,这两条边同时出现或者不出现,概率都是50%. 第三种边一组里有两条边, ...

  8. poj2289二分图多重匹配

    题意:给你一张二分图,求右边点到汇点的最小容量(保证流量为n)是多少 题解:二分答案,每次重新建边跑最大流,看是不是为n就好了 #include<map> #include<set& ...

  9. BZOJ 4025 二分图

    题目大意 给定一个\(n\)个点, \(m\)条边的无向图, 每条边在一定时间范围内存在. 要你判断每个时间点这张图是否为二分图. \(n \le 10^5\) \(m \le 2 \times 10 ...

  10. 二分图匹配匈牙利算法DFS实现

    1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...

最新文章

  1. 有你认识的么?新鲜出炉!云+社区2020年度优秀讲师TOP作者榜单!
  2. VS2019 Android .so开发
  3. java向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明)...
  4. Validation of ViewState Mac failed exception
  5. linux 重定向 2gt;gt;,编写我自己的linux shell I / O重定向’gt;’函数
  6. 5g时代计算机网络过时,5g云电脑 取代主机(5g时代云电脑会普及吗)
  7. Quartz应用与集群原理分析
  8. CV 加持的工业检测,从算法选型到模型部署
  9. oracle单列索引和组合索引性能测试
  10. python中print后面加逗号
  11. AIO、NIO、BIO
  12. 蓝桥杯2016年第七届C/C++省赛B组第一题-煤球数目
  13. 2009年日全食观测方法
  14. Redis容量及使用规划(转)
  15. Nginx的安装、启动、停止命令
  16. 陶哲轩实分析 4.1 节习题试解
  17. Boost PFC参数计算——交流电的基本概念与推导
  18. Ubuntu Screen 后台启动程序安装与运行
  19. excel日期转换为周数_VBA将日期转换为周数
  20. 3U8633——雷达对民航的贡献

热门文章

  1. openlayers3加图标定位
  2. python解析库 爬虫_Python-爬虫-解析库(Beautiful Soup)的使用
  3. Linux中将两块新硬盘合并成一个,挂载到/data目录下
  4. 台式计算机如何扫描文件,打印机怎么扫描,教您打印机怎么扫描文件
  5. 读书笔记:Google软件测试之道
  6. Java校验手机号格式
  7. MySQL——MySQL高可用之 MMM多主复制管理器
  8. 2022年保健品行业研究报告
  9. android面试题整理(上)
  10. 字节二面(估计是凉了)