Solution -「多校聯訓」簽到題
阿新 • • 發佈:2021-10-07
\(\mathcal{Description}\)
Link.
給定二分圖 \(G=(X\cup Y,E)\),求對於邊的一個染色 \(f:E\rightarrow\{1,2,\dots,c\}\),最小化每個結點所染顏色數量極差之和。輸出這一最小值。
\(|X|+|Y|,|E|\le10^6\)。
\(\mathcal{Solution}\)
基於“結論好猜”就能認為這題是簽到題嗎……
答案顯然有下界 \(\sum_{u}\left[c\not\mid \sum_{v}[(u,v)\in E]\right]\)。由於寫一發過掉了大樣例,我們嘗試證明它必然可取到。
證明
**引理(對於二分圖的 Vizing 定理):** 對於二分圖 $G$,$\chi'(G)=\Delta(G)$,其中 $\chi'(G)$ 為 $G$ 的邊染色的色數,$\Delta(G)$ 為 $G$ 中結點的最大度數。
證明: 給出構造。按任意順序列舉 \((x,y)\in E\),令 \(p\) 為 \(x\) 的鄰接邊中未染的最小顏色,\(q\) 為 \(y\) 的鄰接邊中未染的最小顏色。由於 \(\chi'(G)=\Delta(G)\),\(p,q\) 是存在的。
- 若 \(p=q\),令 \(f((x,y))=p\)。
- 若 \(p\not=q\),不妨令 \(p>q\)
,必然存在增廣路 \(P=\lang x_1=x,y_1,x_2,y_2,\cdots,x_k\rang\),滿足 \(\forall i\in[1,k),f((x_i,y_i))=p\land f((y_i,x_{i+1}))=q\)。同時,亦有 \(y\not\in P\)。我們翻轉這條路徑的邊染色,即 \(f((x_i,y_i))\leftarrow q,f((y_i,x_{i+1}))\leftarrow p\)。此時可套用討論 1.。綜上,每條邊都能被染色且不出現共色的鄰接邊。命題得證。 \(\square\)
嘗試將原命題向引理靠攏。令新圖 \(G'\) 初始為 \(G\)
此後,發現 \(\Delta(G')\le c\) 且 \(G'\) 依舊是二分圖。由引理,\(\chi'(G)=\Delta(G)\),我們取出這樣一個染色 \(f\),將拆點合併回原圖 \(G\) 且不改變邊染色,顯然 \(f\) 取到了答案下界。 \(\square\)
\(\mathcal O(|X|+|Y|+|E|)\) 算一算就好。
\(\mathcal{Code}\)
/*~Rainybunny~*/
#ifndef RYBY
#pragma GCC optimize( "Ofast" )
#endif
#include <bits/stdc++.h>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
inline char fgc() {
static char buf[1 << 17], *p = buf, *q = buf;
return p == q && ( q = buf + fread( p = buf, 1, 1 << 17, stdin ), p == q )
? EOF : *p++;
}
inline int rint() {
int x = 0, s = fgc();
for ( ; s < '0' || '9' < s; s = fgc() );
for ( ; '0' <= s && s <= '9'; s = fgc() ) x = x * 10 + ( s ^ '0' );
return x;
}
const int MAXN = 1e6;
int n, m, k, c, deg[MAXN + 5];
int main() {
freopen( "qiandao.in", "r", stdin );
freopen( "qiandao.out", "w", stdout );
n = rint(), m = rint(), k = rint(), c = rint();
rep ( i, 1, k ) {
int u = rint(), v = rint();
++deg[u], ++deg[v + n];
}
int ans = 0;
rep ( i, 1, n + m ) ans += !!( deg[i] % c );
printf( "%d\n", ans );
return 0;
}