【二分图】染色问题
核心思想:为每一个未染色的,对它自己和它的邻居进行染色,看是否会出现冲突
时间复杂度O(n+m)
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=200010;
int n,m;
vector<int>edge[N];
int color[100010];
bool dfs(int u,int c){color[u]=c;for (int v:edge[u]){if (color[v]==0){if (!dfs(v,3-c))return false;}else if (color[v]==c)return false;}return true;
}
int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m; for (int i=1;i<=m;i++){int a,b;cin>>a>>b;edge[a].push_back(b);edge[b].push_back(a);}int f=true;for (int i=1;i<=n;i++){if(color[i]==0){if (!dfs(i,1)){f=false;break;}}}if (f){for(int i=1;i<=n;i++)cout<<color[i]<<' ';}else{cout<<"IMPOSSIBLE";}
}