链接:https://www.nowcoder.com/questionTerminal/e503f18d56754ad9bcf8631adf63721d
来源:牛客网
幼儿园一个大班要分成两个小班,有些小朋友不希望自己和其他某几位小朋友同班。园长向大家收集了不希望同班的要求,然后视情况将一个大班的小朋友分成两个班。请你开发一个程序,帮助园长快速判断是否所有小朋友的不同班请求都可以被满足。
输入描述:
输入分为三部分,
第一个部分是一个 int,代表这个大班里小朋友的总数。
第二部分是一个 int,代表园长采集到的小朋友们的请求数。
第三部分是小朋友们的请求,每个请求由两个 int 组成,第一个 int 代表提请求的小朋友,第二个 int 代表他不希望同班的另一位小朋友。
输出描述:
如果所有小朋友的请求都可以被满足,输出 1,否则输出 0。
示例1
输入
5
5
1 2
1 3
1 4
1 5
2 3
输出
0
说明
总共有 5 位小朋友,总共采集到了 5 个请求。
分别是:1 不希望和 2 同班。1 不希望和 3 同班。1 不希望和 4 同班。1 不希望和 5 同班。2 不希望和 3 同班。
不能满足所有人的请求,输出 0。
示例2
输入
5
4
1 2
1 3
1 4
1 5
输出
1
说明
总共有 5 位小朋友,总共采集到了 4 个请求。
分别是:1 不希望和 2 同班。1 不希望和 3 同班。1 不希望和 4 同班。1 不希望和 5 同班。
可以满足所有人的请求,分班方式:1 一个人一班,2、3、4、5 另一班。输出 1。
#include<bits/stdc++.h>
using namespace std;
int fg;
vector<int >mp[200050];
int a[200050],b[200050],vis[200050];///第一个节点,第二个节点,着色标记
void dfs(int now, int per, int v)///当前节点,上一个节点,着色权值
{
int len = mp[now].size();
vis[now] = v;///当前节点着色
for(int i = 0; i <len;i++)
{
int t = mp[now][i];///下一个节点
if(t==per)continue;///下一个节点与当前节点的上一个节点相同,跳过不予判断
if(vis[t]==-1)dfs(t,now,1-v);///下一个节点未着色,dfs着色
else if(vis[t] == vis[now])fg = false;///当前节点与下一个节点颜色相同,0
}
return;
}
int main()
{
memset(vis,-1,sizeof(vis));
fg = true;
int n,m;
cin>>n>>m;
for(int i = 1; i <=m;i++)
{
cin>>a[i]>>b[i];
mp[a[i]].push_back(b[i]);
mp[b[i]].push_back(a[i]);
}
dfs(1,-1,0);
if(!fg)cout<<"0"<<endl;
else
{
cout<<"1"<<endl;
}
return 0;
}