P1021
事实上这是个暴力,DCEC 算法有时间再补吧。
#include <bits/stdc++.h>
typedef long long i64;
const int N = 100010, M = 100010;
int t, a, b, m;
struct Edges {
int u, v;
}e[M];
int deg[N];
std::unordered_map<i64, int> rec;
i64 bipair(int x, int y) {
return 1ll * x * N + y;
}
int query(int x, int y) {
// is x in the set of colors of edges adjacent to vertex y?
int z = bipair(x, y);
if (rec.find(z) == rec.end()) {
return 0;
} else {
return rec[z];
}
return 114514;
}
void modify(int x, int y, int ymatch) {
rec[bipair(x, y)] = ymatch;
return;
}
int mex(int u) {
int x = 1;
while (query(x, u) != 0) {
++ x;
}
return x;
}
int main(void) {
scanf("%d", &t);
while (t --) {
scanf("%d%d%d", &a, &b, &m);
for (int i = 1; i <= m; ++ i) {
scanf("%d%d", &e[i].u, &e[i].v);
e[i].v += a;
++ deg[e[i].u];
++ deg[e[i].v];
}
for (int i = 1; i <= m; ++ i) {
int x = mex(e[i].u), y = mex(e[i].v);
modify(x, e[i].u, e[i].v);
modify(y, e[i].v, e[i].u);
if (x == y) {
continue;
}
int col = y, w = e[i].v;
while (w) {
int temp = query(x + y - col, w);
modify(x + y - col, w, query(col, w));
modify(col, w, temp);
w = temp;
col = x + y - col;
}
}
int ans = 0;
for (int i = 1; i <= a + b; ++ i) {
ans = std::max(ans, deg[i]);
}
printf("%d\n", ans);
for (int i = 1; i <= m; ++ i) {
for (int j = 1; j <= ans; ++ j) {
if (query(j, e[i].u) == e[i].v) {
printf("%d ", j);
}
}
}
puts("");
for (int i = 1; i <= a + b; ++ i) {
deg[i] = 0;
}
std::unordered_map<i64, int> newbie;
rec.swap(newbie);
}
return 0;
}