機器任務 最小點覆蓋

2022-03-14 08:02:38 字數 1628 閱讀 5080

機器任務

有兩台機器 \(a,b\) 以及 \(k\) 個任務。

機器 \(a\)有 \(n\) 種不同的模式(模式\(0~n-1\)),機器 b 有 m 種不同的模式(模式\(0~m-1\))。

兩台機器最開始都處於模式0。

每個任務既可以在\(a\)上執行,也可以在b上執行。

對於每個任務 \(i\),給定兩個整數 \(a[i]\) 和\(b[i]\),表示如果該任務在 a 上執行,需要設定模式為 \(a[i]\),如果在 b 上執

行,需要模式為 \(b[i]\)。

任務可以以任意順序被執行,但每台機器轉換一次模式就要重啟一次。

求怎樣分配任務並合理安排順序,能使機器重啟次數最少。

輸入格式

輸入包含多組測試資料。

每組資料第一行包含三個整數 \(n, m, k\)。

接下來k行,每行三個整數 \(i, a[i],b[i]\),\(i\) 為任務編號,從\(0\)開始。

當輸入一行為\(0\)時,表示輸入終止。

輸出格式

每組資料輸出乙個整數,表示所需的機器最少重啟次數,每個結果佔一行。

資料範圍

\(n,m<100,k<1000\)

\(0≤a[i]

\(0≤b[i]

輸入樣例:

5 5 10

0 1 1

1 1 2

2 1 3

3 1 4

4 2 1

5 2 2

6 2 3

7 2 4

8 3 3

9 4 3

0

輸出樣例:
3
思路

最小點覆蓋(注意這個定義不僅是適用於二分圖,而是適用於無向圖中)

就是對於我們的每一條邊,至少有乙個端點被選擇出來

對於我們的二分圖來說,有一種特殊的性質,就是我們的最小點覆蓋就等於最大匹配數。

證明:1.最小點覆蓋》=最大匹配數

因為最大匹配中的所有邊是相互獨立的,要想覆蓋所有的邊至少要在每一條邊上選乙個點,既匹配數個點

2.等號是可以成立的,通過構造

對於這道題

乙個任務可以被a、b機器的兩種狀態完成,將乙個任務看成一條邊,兩種狀態看成兩個端點,要完成一

個任務就要從這兩個點中選乙個

點,對於所有任務就要選出最少的點,覆蓋所有的邊,問題就變成求最小點覆蓋問題。

也就是求最大匹配數

**

#includeusing namespace std;

const int n=200100;

int ne[n],ver[n],idx,head[n];

int match[n],st[n];

int n,m,k;

void add(int u,int v)

bool find(int x)}}

return false;

}int main()

int res=0;

for(int i=1;icout<}

return 0;

}

最小點覆蓋

題目連線 最小點覆蓋為 在乙個二分圖中,選取最少的點可以把所有的變覆蓋,點的最少個數就是最小點覆蓋。最小點覆蓋 最大二分匹配。克魯斯卡爾演算法。關於本題 把從零開始,轉化成從一開始。起點不用加入e,因為機器的起始狀態就是1,或者加入e但是不參加計算,我採用的是第二種。include include ...

Asteroids 最小點覆蓋問題

bes si ebessie bessie 想以n nn n nn網格 1 n 500 1 n 500 1 n 5 00 的形狀在危險的小行星場中導航她的飛船。網格包含k kk個小行星 1 k 10 000 1 k 10,000 1 k 1 0,00 0 它們方便地位於網格的晶格點處。幸運的是,貝茜...

最小點覆蓋 K nig定理

k nig定理是乙個二分圖中很重要的定理,它的意思是,乙個二分圖中的最大匹配數等於這個圖中的最小點覆蓋數。如果你還不知道什麼是最小點覆蓋,我也在這裡說一下 假如選了乙個點就相當於覆蓋了以它為端點的所有邊,你需要選擇最少的點來覆蓋所有的邊。自 匈牙利演算法需要我們從右邊的某個沒有匹配的點,走出一條使得...