hdu 5285 wyh2000 and pupil 二分图染色发判定,求最大匹配
染色法判定是不是二分图,如果是二分图,每个相邻的点都可以染成不相同的颜色,如果存在有两个点相邻并且颜色相同,则构不成二分图。这题构成二分图有很多种情况,贪心的选择使得第一组的人数最多就行。注意如果第二组人数至少要为一。
wyh2000 and pupil
青年理论计算机科学家wyh2000在教导他的小学生。 共有n个小学生,编号为1−n。为了增加小学生之间的凝聚力,wyh2000决定将所有小学生分成2组,每组都至少有1个人。 但是有些小学生之间并不认识,而且如果a不认识b,那么b也不认识a。 Wyh2000希望每组中的小学生都互相认识。而且第一组的人要尽可能多。 请你帮wyh2000求出第一组和第二组的人数是多少。如果找不到分组方案,则输出"Poor wyh"。
第一行一个数T,表示数据组数。 对于每组数据,第一行两个数n,m,表示小学生数量和互相不认识的小学生的数量。 接下来m行,每行两个数x,y(x<y),表示x不认识y,y不认识x。保证一对(x,y)只会出现一次。 T≤10,0≤n,m≤100000
对于每组数据,输出答案。
2 8 5 3 4 5 6 1 2 5 8 3 5 5 4 2 3 4 5 3 4 2 4
5 3 Poor wyh
代码是参照了别人的。
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<set>
#define inf 0x3f3f3f3f
#define mem(a,x) memset(a,x,sizeof(a))using namespace std;typedef long long ll;
typedef pair<int,int> pii;inline int in()
{int res=0;char c;while((c=getchar())<'0' || c>'9');while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();return res;
}vector<int> v[100010];
int color[100010];
bool flag=1;int a[2]; //a数组代表每次染色分成两组的人数
int ans1,ans2;
void dfs(int x)
{a[color[x]-1]++; //如果color[x]是颜色1,则第一组人数加一,如果是颜色二,第二组人数加一for(int i=0;i<(int)v[x].size();i++){int t=v[x][i];if(color[t]==0){color[t]=(3-color[x]); //当前颜色取跟上一个颜色相反的颜色dfs(t); //从前点在进行染色}else if(color[t]==color[x]){flag=0; //如果存在当前颜色与前面相邻颜色一样,则不能构成二分图}}
}
int main()
{int T=in();while(T--){int n=in(),m=in();int t1,t2;ans1=0,ans2=0;for(int i=0;i<=n;i++){v[i].clear();}mem(color,0);flag=1; //注意每次初始化for(int i=0;i<m;i++){t1=in(),t2=in();v[t1].push_back(t2);v[t2].push_back(t1);}if(n<2){puts("Poor wyh");continue;}int ans=0;for(int i=1;i<=n;i++){if(!color[i]){a[0]=a[1]=0;color[i]=1;dfs(i);ans += max(a[0],a[1]);//贪心的取最大的一组}}if(flag){if(ans==n)ans--;printf("%d %d\n",ans,n-ans);}else puts("Poor wyh");}return 0;
}
hdu 5285 wyh2000 and pupil 二分图染色发判定,求最大匹配相关推荐
- hdu 2444(二分图的判断以及求最大匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2444思路:首先要判断能否构成二分图,用bfs对当前点u染色,对u的邻接点v的颜色进行判断,如果为染色, ...
- 【HDU - 2444】The Accomodation of Students(二分图判断 + 匈牙利算法求最大匹配)
题干: There are a group of students. Some of them may know each other, while others don't. For example ...
- P1155 双栈排序(二分图染色)
P1155 双栈排序(二分图染色) 题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一 ...
- 【hdu5285】wyh2000 and pupil
今天下午的二分图染色给我开启新世界的大门啊2333333 这个题要比刚才的关押罪犯简单,只需要染一遍色就能求出答案 #include<iostream> #include<cstri ...
- LOJ P1155 双栈排序 二分图染色 图论
https://www.luogu.org/problem/show?pid=P1155 题解: https://www.byvoid.com/zhs/blog/noip2008-twostack 开 ...
- Relation(NOIP模拟赛)(二分图染色)
原题: Description 有n个人,编号为1àn,告诉你那些人之间是不友好的.现在,让你将这n个人分成两组,使得每一组之内的人是互相友好的,如果可以分成两组,则输出如何分组的,如果不可以分成两组 ...
- 【POJ 2942】Knights of the Round Table(点双连通分量,二分图染色)
圆桌会议必须满足:奇数个人参与,相邻的不能是敌人(敌人关系是无向边). 求无论如何都不能参加会议的骑士个数.只需求哪些骑士是可以参加的. 我们求原图的补图:只要不是敌人的两个人就连边. 在补图的一个奇 ...
- uva 11080(二分图染色)
题意:一个国王要派若干士兵看守王国.王国是一张无向图,然后士兵只能站在点上.每个士兵的看守范围是临近的点与边,士兵看管的的边不能重复.问最少用多少个士兵能使每个点和边都有人看守. 思路:这道题可以抽象 ...
- Codeforces Round #742 (Div. 2) F. One-Four Overload 构造 + 二分图染色
传送门 文章目录 题意: 思路: 题意: 给你一个n∗mn*mn∗m的矩形,包含...和XXX,你有两种颜色,你需要给...染色使得每个XXX上下左右相邻的...其两种颜色个数相同,输出一种合法方案. ...
- 【Hitachi2020C】ThREE【构造】【二分图染色】
传送门 题意:给一棵nnn个结点的树,构造一个nnn阶排列ppp,使得所有距离为333的点对(i,j)(i,j)(i,j)满足pi+pjp_i+p_jpi+pj和pipjp_ip_jpipj至 ...
最新文章
- 服务器架设笔记——搭建用户注册和验证功能
- Robot Christmas!机器人玩转圣诞节!
- hh.exe的另类用法
- [C++] 指向常量的指针 VS 指针类型的常量
- 兰州谋定百合品牌-农业大健康·万祥军:功能性农业产业脱贫
- jq php异步上传图片,PHP+Ajax实现图片异步上传预览
- ?: (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.
- html5块元素代码,html5 区块与内联div 与span html块级元素(示例代码)
- Jquery获得服务器控件的方法
- STM32驱动SG90舵机
- UWP 如何访问本地代理
- InstallShield Slient Uninstall
- 今日总结-20220304
- 使用Python爬出王者荣耀高清皮肤图片
- WPF工控组态软件之温度计
- 【嵌入式】基于平头哥内核的W801 WIFI SoC的OTA方案设计
- 2.手电筒原理、手电筒原理应用:拐弯通信以及电报机
- 使用Python评估一支股票的价格
- SQLServer Stuff函数的用法
- 如何搭建一套免费开源的微信群机器人问答系统?