http://acm.hdu.edu.cn/showproblem.php?pid=2444
题目大意:有n个人之间有m对互相认识,问能否将所有人分成两组,同一组的任意两人互不认识。若不能分组输出“No”,若能分组计算并输出有最多有多少对人互相认识;
思路:先用DFS进行染色,判断能否分成两组组(即能否构成二分图),如果可以求二分图的最大匹配;
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 202
using namespace std;
int map[N][N],link[N],visit[N],color[N];
bool flag;
bool DFS(int i,int n,int c)
{
int j;
for(j=1;j<=n;j++){
if(map[i][j]==1){
if(color[j]==c)
continue;
if(color[j]==0){
color[j]=c;
flag=DFS(j,n,-c);
}
else{
return false;
}
if(!flag)
return false;
}
}
return true;
}
bool find(int x,int n)
{
int y;
for(y=1;y<=n;y++){
if(map[x][y]==1 && visit[y]==0){
visit[y]=1;
if(link[y]==-1 || find(link[y],n)){
link[y]=x;
return true;
}
}
}
return false;
}
int main()
{
int n,m,a,b,i,cnt;
while(scanf("%d%d",&n,&m)!=EOF){
flag=true;
memset(map,0,sizeof(map));
memset(link,-1,sizeof(link));
memset(color,0,sizeof(color));
while(m--){
scanf("%d%d",&a,&b);
map[a][b]=map[b][a]=1;
}
for(i=1;i<=n;i++){//对每个点通过DFS进行染色
if(color[i]==0)
color[i]=1;
flag=DFS(i,n,-color[i]);
if(!flag)break;
}
if(!flag){
printf("No\n");
continue;
}
for(i=1,cnt=0;i<=n;i++){
memset(visit,0,sizeof(visit));
if(find(i,n))
cnt++;
}
printf("%d\n",cnt/2);
}
return 0;
}
分享到:
相关推荐
以上题型涵盖了二分图匹配问题的主要方面,包括最大匹配、最小点覆盖、最小路径覆盖、行列匹配等,同时也涉及到了更高级的问题如多重匹配、最大独立集等。通过练习这些题目,可以加深对二分图匹配算法的理解,并提高...
HDU(杭州电子科技大学)在线评测系统是许多编程竞赛爱好者和学习者经常访问的平台,它提供了大量的算法题目供用户练习和挑战。这个压缩包文件“HDU 2000-2099 解题报告”显然包含了在这个题号范围内的一些问题、...
hdu 3341(ac自动机+状态压缩) 题意:容易理解... 思路:首先一开始容易想到要用到dp,开设一个dp[41][41][41][41][501]的数组来解决,但是明显内存已经超出范围了,于是就想如何减少内存呢?只要知道A、T、C、G其中...
二分图的完美匹配是指在一个图中,每个顶点恰好被一条边连接,使得图中的所有顶点都被连接且没有多余未使用的边。在实际应用中,二分图的完美匹配常常出现在分配问题、调度问题等领域。KM算法,即Kuhn-Munkres算法,...
《杭电OnlineJudge 2000-2099解题报告》是针对杭州电子科技大学(HDU)在线评测系统(OnlineJudge)中2000至2099题目的详细解答集锦,主要涵盖了算法分析、编程技巧以及问题解决策略等内容。这份解题报告以CHM...
本人准备2020年保研机试时刷的题目(虽然最后机试取消了,...来自某中流985,在HDU和vjudge平台上大概刷了400道。本文件地图(excel表格)包含了绝大部分我刷过的题目,笔记中具有思路、代码、总结和心得。 大佬勿入!
HDUACM2010版13二分匹配及其应用.ppt
ACM hdu 线段树题目+源代码 线段树是一种非常重要的数据结构,它广泛应用于算法竞赛和实际编程中。今天,我们将通过 ACM hdu 的几个题目来学习和掌握线段树的基本概念和应用。 线段树的基本概念 线段树是一种...
二分匹配就是寻找二分图中的最大匹配,即在不违反匹配规则的前提下,找到包含最多边的匹配。 二分匹配的核心算法是 Hopcroft-Karp 算法,这是一种基于最短路径的增广路径方法。它通过多次迭代,每次尝试找到一条...
通过构建二分图模型,可以将求解最大流转化为寻找最大匹配的问题。 5. **市场交易**:在股票交易、拍卖等市场环境中,买家和卖家之间可以形成匹配。二分匹配可以用来确定最大化的交易量,同时考虑交易价格和其他...
二分图匹配实例代码及整理 1、匈牙利算法 HDU 1150 #include #include #include using namespace std; int m,n,k; int vis[105]; int mpt[105][105]; int use[105]; int hungary(int x) { for(int i=1;i<m;i++)...
"hdu 1695 GCD(欧拉函数+容斥原理)" 题目大意是:给定 a, b, c, d, k,找到一队 x, y,满足 g(x, y) = k,且 x ∈ [1, b], y ∈ [1, d],问有多少对符合要求的 (x, y)。 思路是:gcd(x, y) == k 解释 x, y 都能...
HDU 300+ AC 代码集合是一个包含超过300个已通过验证的算法解决方案的资源,这些代码主要用于解决各类计算机编程竞赛中的问题。这些竞赛通常由杭州电子科技大学(HDU)主办,旨在提升参赛者的算法设计、编程和问题...
Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。...
- **HDU** 指的是“杭州电子科技大学”(Hangzhou Dianzi University),这所大学在ACM国际大学生程序设计竞赛中有着优异的表现。 - **ACM** 是指“Association for Computing Machinery”,即计算机协会,而在此处...
ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...
HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...
【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...
这个课件可能介绍了二分图的定义、性质,以及最大匹配算法,如Kuhn-Munkres算法或匈牙利算法。 10. **课件10: 母函数及其应用_new** 母函数是解决序列和问题的有效工具,尤其在处理递推序列时。这个课件可能解释了...
【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...