hdu 5285 wyh2000 and pupil(二染色)
2024-08-28 12:00:20
第一次用vector解得题。值得纪念,这道题是二染色问题,我用bfs解得。就是染色,推断,计数问题,其
实挺简单的,就是得判一下特殊情况,当n<2的时候就不能有解,由于题目要求每一个组至少有一个人。当没有不认识的
人的时候就是一个组是n-1,还有一个组人数为1
上代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int visit[100005];
int n,m,flag,ans1,ans2;
vector<int>v[100005];
int bfs(int x)
{
queue<int>q;
q.push(x);
visit[x] = 1;
while(!q.empty())
{
int y = q.front();
q.pop();
if(visit[y] == 1)
ans1++;
else
ans2++;
for(int i=0; i<v[y].size(); i++)
{
if(visit[v[y][i]]==-1)
{
visit[v[y][i]] = !visit[y];
q.push(v[y][i]);
}
else
{
if(visit[v[y][i]]==visit[y])
{
return 0;
}
}
}
}
return 1;
}
void solve()
{
int Max = 0;
memset(visit,-1,sizeof(visit));
for(int i=1; i<=n; i++)
{
ans1 = ans2 =0;
//printf("size = %d i = %d\n",v[i].size(),i);
if(v[i].size()==0)
continue;
if(visit[i]==-1&&!bfs(i))
{
flag = 1;
break;
}
Max += min(ans1,ans2); //printf("ans1 = %d ans2 = %d\n",ans1,ans2);
}
if(flag)
printf("Poor wyh\n");
else
printf("%d %d\n",n - Max,Max);
return ; }
int main()
{
int T,c,i,j,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
v[i].clear();
for(i=1; i<=m; i++)
{
scanf("%d%d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
if(n < 2)
{
puts("Poor wyh");
continue;
}
if(m == 0)
{
printf("%d 1\n",n-1);
continue;
}
flag = 0;
solve();
}
return 0;
}
最新文章
- LInux MySQL 数据库 的一些操作
- LUA OOP 单例模式实现的 一个 方案
- Xcode解决代码高亮、语法提示、错误警告等功能失效的解决方法
- .NET Core尝试
- js文本框提示和自动完成
- 2.python基础深入(元组、字符串、列表、字典)
- unity3d快捷键大全
- android下面的文案重用
- J2EE ssm框架-服务启动项内存加载数据及读取。
- 关于泥水佬的minihttp与MVC4的对比
- java调用存储过程超时及DBCP参数配置说明
- 软考之路--从生活着手,看PV如何操作
- yolo v2使用总结
- SCTP一到多式流分回射服程序
- 关于ava容器、队列,知识点总结
- 网络:LVS负载均衡原理
- BZOJ4399魔法少女LJJ——线段树合并+并查集
- python 历险记(三)— python 的常用文件操作
- shell中调用R语言并传入参数的两种步骤
- BFS和DFS详解以及java实现