题目链接:https://vjudge.net/problem/CodeForces-1228D
题解:我们把每个点哈希,这样就能计算出和每个点连接的其他点的总哈希值,若只有三种哈希值的和,那么就是符合的,当然还有其他很多种做法。
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N = 1e5 + 10;
ull has[N];
int n, m;
ull vis[N];
map<ull, ull> mp;
int main() {
int x, y;
cin >> n >> m;
has[0] = 1;
for(int i = 1; i <= n; i++) has[i] = has[i - 1] * 100007;
for(int i = 1; i <= m; i++) {
cin >> x >> y;
vis[x] += has[y];
vis[y] += has[x];
}
ull cnt = 1;
int flag = 1;
for(int i = 1; i <= n; i++) {
if(vis[i] == 0) flag = 0;
if(!mp[vis[i]]) {
mp[vis[i]] = cnt++;
}
vis[i] = mp[vis[i]];
}
if(cnt != 4 || !flag) cout << "-1\n";
else for(int i = 1; i <= n; i++) printf("%llu%c", vis[i], " \n"[i == n]);
return 0;
}