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 3341(ac自动机+状态压缩) 题意:容易理解... 思路:首先一开始容易想到要用到dp,开设一个dp[41][41][41][41][501]的数组来解决,但是明显内存已经超出范围了,于是就想如何减少内存呢?只要知道A、T、C、G其中...
ACM题库,一些题目和答案,以及解题报告,传上来共享
杭电OnlineJudge 200-2099的解题报告
本人准备2020年保研机试时刷的题目(虽然最后机试取消了,...来自某中流985,在HDU和vjudge平台上大概刷了400道。本文件地图(excel表格)包含了绝大部分我刷过的题目,笔记中具有思路、代码、总结和心得。 大佬勿入!
acm hdu as easy as a+b
hdu 1695 GCD(欧拉函数+容斥原理).docx
HDUACM2010版13二分匹配及其应用.ppt
二分图匹配实例代码及整理 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++)...
B HDU 5093 Battle ships题意给出一个n行m列的图,*代表海域,o代表冰水,#代表冰山,要想在海域中放置船,保证船与船之间不能相互看到,之间
Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。...
从简单入门到偏中等的几个题,线段树很灵活,主要懂了lazy操作,其他的自己yy吧。
300+ AC 代码 。 大数 , 线段树 , 字符串 , dp.....
杭电ACM课件2014版之(HDUACM2010版_13)二分匹配及其应用
HDU二分匹配及其应用,此PPT是刘春英老师版权所有, 特此贡献给广大编程爱好者,特别是对于ACMer
HDU的1250,主要是利用高精度加法,但是代码有点繁琐,效率不是很高
HDU1059的代码
杭电ACMhdu1163
hdu1001解题报告
2、new做两件事,一是分配内存,二是调用类的构造函数 3、new建立的是一个对象,而malloc分配的是一块内存 4、new/delete是保留字,不需要头文
hdu 1574 passed sorce