列表

详情


NC19185. 分组

描述

你和你的个好朋友共人在参加一个聚会
每个人都认识聚会中的一些人(互相认识),也有可能不认识聚会中的任何一个人。保证每个人所认识的人的个数不超过
你们希望分成两组,使得每一个人至多认识一个和自己同一个组的人

输入描述

第一行两个数,代表人数和互相认识的人的对数
接下来行每行两个数,代表一对互相认识的人
认识关系不会重复给出,不会出现一个人认识自己的情况

输出描述

一行个数,每个数是或者
代表被分到了哪个组
有多组答案时任意输出一组
无解输出-1

示例1

输入:

4 5
1 2
2 3
3 4
1 3
2 4

输出:

1 2 1 2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 265ms, 内存消耗: 12664K, 提交时间: 2020-06-16 20:39:54

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
 
int f[N];
vector<int> G[N];

void dfs(int x){
    int sum=0;
    for(auto i:G[x]){
        if(!f[i]) f[i]=f[x]^3,dfs(i);
        if(f[i]==f[x]) sum++;  
    }
    if(sum>=2) f[x]^=3;
}
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v;cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    memset(f,0,sizeof(f));
    for(int i=n;i>=1;i--) if(!f[i]) f[i]=1,dfs(i);
    for(int i=1;i<=n;i++) cout<<f[i]<<" \n"[i==n];
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 198ms, 内存消耗: 9724K, 提交时间: 2020-06-16 19:42:19

#include<bits/stdc++.h>
using namespace std;

vector<int>R[100005];
bool V[100005]={0},T[100005]={0};
void DFS(int x)
{
	int i,j,k=0;
	for(i=0;i<R[x].size();i++)
	{
		j=R[x][i];
		if(!V[j])V[j]=1,T[j]=!T[x],DFS(j);
		if(T[j]==T[x])k++;
	}
	if(k>1)T[x]^=1;
}
int main()
{
    int i,j,n,m; 
    scanf("%d%d",&n,&m);
    while(m--)
    {
    	scanf("%d%d",&i,&j);
    	R[i].push_back(j),R[j].push_back(i);
	}
	for(i=1;i<=n;i++)if(!V[i])DFS(i);
	for(i=1;i<=n;i++)printf("%d ",T[i]+1);
}

上一题