测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A18503. 染色

填空题 困难

题目描述

染色

题目描述

小杨同学有一张包含 个结点的无向图G, G中的结点依次以 1,2,,,,n 编号。

小杨同学发现G中每个结点的度数都是2。显然G中恰好有n条边。

小杨同学想为G中的结点染色,使得任意一条边两端的结点都有不同的颜色。

小杨同学想知道最少需要多少种颜色才能在满足条件的前提下为G染色。

输入格式

本题包含多组数据。

第一行,一个正整数 t ,表示数据组数。

对于每组数据:

第一行,一个正整数 n,表示无向图 中的结点数。

接下来 n 行,每行两个正整数 ui, vi,表示一条连接结点 ui 与 vi 的无向边,整数之间以空格分隔。

保证G中没有重边与自环。

输出格式

对于每组数据:输出一行,一个整数,表示在满足条件的前提下为 染色需要的最少颜色数。

输入样例

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

输出样例

2
3
3
3

参考答案

#include <iostream> #include <algorithm> using namespace std; int n; int a[100010], b[100010], cnt[100010]; void solve() { cin >> n; for (int i = 1; i <= n; i++) a[i] = b[i] = cnt[i] = 0; for (int i = 1; i <= n; i++) { int u, v; cin >> u >> v; b[u] = a[u]; a[u] = v; b[v] = a[v]; a[v] = u; } bool flag = false; for (int i = 1; i <= n; i++) { if (cnt[i]) continue; int u = i, last = a[u]; int v = a[u] + b[u] - last; while (!cnt[v]) { cnt[v] = cnt[u] + 1; last = u; u = v; v = a[u] + b[u] - last; } if (cnt[i] % 2 != 0) flag = true; } if (flag) cout << 3 << endl; else cout << 2 << endl; } int main() { int t; cin >> t; while (t--) solve(); return 0; }
上一题 下一题