題目連結: https://codeforces.com/problemset/problem/1228/D

# 內容

給出一張簡單圖,其節點數為 n,邊數為 m,判斷此圖是否能構成三分圖 (就是二分圖的強化版),此圖必須使用三種顏色。若能構成三分圖就將每個節點的顏色輸出,否則輸出 - 1。

# 思路

哈希每一個節點,這樣就能計算出和每個點連接的其他點的總哈希值,
若只有三種哈希值的和,那麼就是符合的~~再用 map 紀錄顏色就好。

# 程式碼

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N = 1e5 + 10;
ull Hash[N];
int n, m;
ull vis[N];
map<ull, int> mp;
int main() {
	int x, y;
	cin >> n >> m;
	Hash[0] = 1;
	for(int i = 1; i <= n; i++) Hash[i] = Hash[i - 1] * 100007;
	for(int i = 1; i <= m; i++) {
		cin >> x >> y;
		vis[x] += Hash[y];
		vis[y] += Hash[x];
	}
	int cnt = 1;
	int flag = 1;
	for(int i = 1; i <= n; i++) {
		if(vis[i] == 0) flag = 0; //no connected
		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++) cout<<vis[i]<<" "; cout << '\n';
	return 0;
}
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay