传送门
哈希真的是太强大了,这种图论题都可以用哈希的方法来解。题目给你一幅图,问能否构成三分图。如果两个点编号都为1,则这两个点连接的所有顶点都相同,可以利用哈希的思想,把每个节点都用哈希编号,然后对于每一个u,把其相连节点的哈希值加起来,最后每个节点都有一个相邻节点的哈希值之和,如果两个节点哈希之和相等,说明这两个节点编号相同。最后有一个需要注意的地方是,如果一个点相邻节点哈希值为0,则不满足条件。
#include<iostream>
#include<unordered_map>
using namespace std;
const int MAXN = 1e5+5;
const long long BASE = 31;
const long long MOD = 1e5+7;
long long POW[MAXN];
long long Hash[MAXN];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin >> n >> m;
POW[1] = 1;
for(int i = 2; i <= n; ++i){
POW[i] = POW[i-1]*BASE % MOD;
}
int u, v;
for(int i = 1; i <= m; ++i){
cin >> u >> v;
Hash[u] = (Hash[u]+POW[v]) % MOD;
Hash[v] = (Hash[v]+POW[u]) % MOD;
}
unordered_map<long long, int> mp;
int count = 0;
for(int i = 1; i <= n; ++i){
if(Hash[i] == 0){
count = 10;
break;
}
if(mp[Hash[i]] == 0){
mp[Hash[i]] = ++count;
}
}
if(count != 3){
cout << "-1" << endl;
}
else{
for(int i = 1; i <= n; ++i){
cout << mp[Hash[i]] << " ";
}
cout << endl;
}
return 0;
}