1. 程式人生 > 遊戲攻略 >《艾爾登法環》失色鍛造石7與洗點道具位置

《艾爾登法環》失色鍛造石7與洗點道具位置

二分圖判定

染色法。
另外,對於任意無向圖,不存在奇環時一定是二分圖。

二分圖最大匹配

“任意兩邊都沒有公共端點”的邊的集合稱為二分圖的一組匹配。邊數最大的匹配為最大匹配。
增廣路:兩端點都在左部,由非匹配、匹配、非匹配、匹配……非匹配的邊組成的路徑。將增廣路上的匹配邊與非匹配邊取反,所得到的新的邊集一定也是一組匹配,且邊數+1。
匈牙利演算法通過不斷尋找增廣路並將其取反,從而得到最大匹配。

bool dfs(int x) {
	for (int i = head[x]; i; i = nxt[i]) {
		int y = ver[i];
		if (!vis[y]) {
			vis[y] = 1;
			if (!match[y] || dfs(match[y])) {
				match[y] = x; return 1;
			}
		}
	}
	return 0;
}

for (int i = 1; i <= n; i++) {
	memset(vis, 0, sizeof (vis));
	if (dfs(i)) ans++;
}

演算法實現中似乎並沒有尋找增廣路的部分,但仔細分析:
設x1嘗試匹配y1,此時若y1沒有匹配,則x1 ~ y1為增廣路,匹配x1與y1即為取反增廣路;
若y1匹配x2,那麼dfs(x2)。此時發現x2與y2相連但未匹配,則x1 ~ y1 ~ x2 ~ y2為增廣路,匹配邊=1。將x2與y2匹配,x1與y1匹配即為取反增廣路,匹配邊=2。
匈牙利演算法基於深搜實現,return值為找到/沒找到增廣路,遞迴時改變match,實質是將增廣路取反的過程。

應用

二分圖最大匹配難點在於建模。其要旨在於尋找“0要素”與“1要素”。
0要素:節點能分成兩個獨立的集合,集合內沒有邊相連。
1要素:每個節點只能與一條匹配邊相連。

例:棋盤覆蓋Acwing372
此題,我們將棋盤染色,對於格子(i,j),若i+j為偶數則染成白色,i+j為奇數則染成黑色。將格子作為二分圖中的節點,滿足0要素。放置骨牌相當於匹配兩個節點,骨牌不能重合,滿足1要素。要讓骨牌不重疊的情況下儘量多放,即為求二分圖的最大匹配。

一些NB的推廣

最小點覆蓋

在給定二分圖中求出一個最小的點集\(S\),使得圖中任意一條邊都有至少一個端點屬於\(S\)。此集合稱為二分圖的最小點覆蓋。
結論:二分圖中最小點覆蓋包含的點數=最大匹配數。
證明:略
例:AsteroidsPOJ3041
抽象:在一個矩陣中有若干點,每次選擇一行或一列並標記其上所有點。問最少需要幾次操作標記所有點。
將行作為二分圖的左部,列作為二分圖的右部,每個點作為一條邊。每次操作選擇一個點,並標記與之相聯的所有邊。易得,原問題的答案即為二分圖中最小點覆蓋包含的個數。

最大獨立集

最大獨立集為一個點集\(S\),且滿足集合中任意兩點沒有邊相連。此問題的求解在一般無向圖中無法用多項式時間複雜度解決,但在二分圖中有巧妙的轉化方法。
結論:二分圖的大小為n,則其最大獨立集的大小=n-最大匹配數。
證明:
選出最多的點構成獨立集
⇔在圖中刪去最少的點,並刪去這些點的相連邊,使圖中沒有邊
⇔用最少的點覆蓋所有邊
⇔求解最小點覆蓋
於是,去掉二分圖的最小點覆蓋,剩下的所有點構成最大獨立集。
例:騎士放置Acwing378
我們可以驚奇地發現,當對棋盤染色(同上)後,白點只能走到黑點,黑點只能走到白點。於是考慮構建二分圖。白點為左部,黑點為右部。連線一個點與其能跳到的所有點。那麼,相鄰的兩點不可以同時選擇。求最多選擇多少點,即為求最大獨立集。

最小路徑點覆蓋

簡稱最小路徑覆蓋。對於一張DAG,用最少的互不相交的路徑覆蓋所有點。“相交”定義為經過相同的點。單獨一點也算一條路徑。
將圖中每個點拆成兩個點:入點與出點,每條有向邊從出點指向入點。新圖記為\(G_2\)
結論:最小路徑點覆蓋包含的路徑條數=n-\(G_2\)的最大匹配數。
不難看出\(G_2\)為二分圖。不妨設出點為左部,入點為右部。則最小路徑覆蓋中的所有邊在\(G_2\)中構成一組匹配。且每條路徑的終點的出點一定為孤立點,所有出點為孤立點的點一定為路徑的終點。於是問題轉化為:求二分圖左部的非匹配點最少為多少。於是得到以上結論。

最小路徑可重複點覆蓋

概念與上相似,但路徑可以相交。
結論:對原圖求傳遞閉包,在新圖上的最小路徑點覆蓋即為答案。證明略。
例:捉迷藏Acwing379
藏身點個數=最小路徑可重複點覆蓋。
證明:即路徑的終點集合為\(E\)\(next(E)\)表示\(E\)中所有點能到達的點的集合。對於\(E\)中的一點\(x\)
\(x∉next(E)\),則\(x\)可以作為藏身點;
\(x∈next(E)\),則逆著此路徑倒著走,直到\(x∉next(E)\)為止。可證明此\(x\)一定存在。用反證法:若此路徑上的所有點都∈next(E),那麼此路徑不必存在,與“最少路徑”矛盾。

In the end

圖論博大精深。二分圖還沒學完,明天看多重匹配與帶權匹配。