匈牙利演算法之hdu1150

2021-06-01 22:30:50 字數 959 閱讀 9491

//題目大意:有ab兩種機器,分別有很多種工作狀態.如果從一種狀態換到另外一種狀態的話.

//需要重啟機器..現在給乙個關係...表示任務i可以用a中的乙個機器或者是b中的乙個機器來完成.

//求最小的重啟次數..完成所有任務..

//題目連線:

//思路:由於每個任務都可以用a或b機器的某種工作狀態來完成,

//因此,對於每個任務,可以把a,b的工作狀態作為頂點,

//在對應的a和b的工作狀態間連線,則對於每條邊的兩個頂點,

//因為每個任務都要完成,故至少要有乙個頂點(某個機器的一種狀態)存在,

//這樣這個問題就轉化成了在這些頂點中選取盡量少的頂點(盡量少的工作狀態,盡量少的重啟次數),

//使得每一條邊都至少和其中乙個點相關聯,即最小點覆蓋問題。

//由於二分圖的最小點覆蓋數=最大匹配數,故可用匈牙利演算法解決。

#include

#include

#include

using namespace std;

#define max 110

int map[max][max];

int m,n,k,z,x,y;

int mk[max];

//從x集合中的頂點u出發用深度優先的策略尋找增廣路

//(這種增廣路只能使當前的匹配數增加1)

int nx,ny; //x和y集合中頂點的個數

int cx[max],cy[max];

//cx[i]表示最終求得的最大匹配中與xi匹配的y頂點, cy[i]同理

int path(int u)}}

return 0 ; //如果不存在從u出發的增廣路

}int maxmatch() //求二部圖最大匹配的匈牙利演算法

}return res;

}int main()

int max=maxmatch();

cout<

hdu 1150 最小點覆蓋

題意大致是 有ab兩台機器,a機器有n個模式,b機器有m個模式,k個任務,每個任務可以由ab其中一台機器完成,但需要不同的模式。機器每轉換一次模式就要重啟一次,機器初始時的模式是0,求重啟的最小次數。我們首先將ab的不同模式看作乙個二分圖,對於每乙個任務i,如果它可以由a機器的j模式或者b機器的k模...

hdu1150 最小點覆蓋

題目鏈結machine schedule 有a和b兩個機器,每個機器有不同工作模式,有很多任務,每個任務可以自在a上以mode i執行或者是在b上以mode j執行,每次換mode都要重啟機器 給出k個任務,要求怎麼安排才能讓重啟次數最少 最小點覆蓋 最小覆蓋要求用最少的點 集合或 集合的都行 讓每...

hdu 1150 最小點覆蓋

題目大意 有兩台機器a和b以及n個需要執行的任務。每台機器有m種不同的模式,而每個任務都恰好在一台機器上執行。如果它在機器a上執行,則機器a需要設定為模式xi,如果它在機器b上執行,則機器a需要設定為模式yi。每台機器上的任務可以按照任意順序執行,但是每台機器每轉換一次模式需要重啟一次。請合理為每個...