LA 3415 保守的老師

2022-04-01 07:17:57 字數 1102 閱讀 1010

題意:有一些同學,要從中選出一些同學來,人數盡量多,但是,兩兩之間要滿足至少乙個條件(身高差》40,性別相同,。。。)

分析:最大獨立集:盡量選擇多的結點,任意兩個結點不相鄰;

男同學x,女同學y,如果可能產生關係,連一條邊,這樣這兩個人就不會在一起;

最大獨立集=n-最大匹配

證明:最小點覆蓋 = 對於每一條邊,至少有乙個點要被選中

最大獨立集 = 對於每一條邊,最多乙個點被選中

從定義中可以看出,這兩個是互補的;

1 #include 2

3using

namespace

std;45

const

int maxn = 500+5;6

7struct

bpm

2223

void addedge(int u,int

v) 26

27bool match(int

u) 38}39

}40return

false;41

}4243int

solve()

53return

ans;54}

5556

}sol;

5758

struct

student

62};

6364

bool conflict(const student& a,const student&b)

6768

intmain()

6983

int x =male.size();

84int y =female.size();

85sol.init(x,y);

86for(int i=0;i)

87for(int j=0;j)

88if

(conflict(male[i],female[j]))

89sol.addedge(i,j);

90 printf("

%d\n

",x+y-sol.solve());91}

92return0;

93 }

view code

HDU3415單調佇列

這題是單調佇列的典型運用。至於單調佇列,就是乙個雙端佇列,在隊首 f 出隊,在隊尾 b 出隊入隊,我們要維護整個佇列的元素是單調的,比如,我們要動態查詢從左向右的區間的最小值,那麼我們就要在佇列中維護乙個單調遞增的序列,從左向右列舉,佇列的元素還有乙個id值,代表這個元素在原序列中的位置,然後左邊的...

HDU 3415單調佇列

這個題目屬於常見題型,給定一組環狀數列,求出其中長度不超過k的數字之和的最大值。用到了字首和的技巧,比如要求i,j間所有數字之和,可以提前在輸入的時候計算出從0 i的數字之和及從0 j的數字之和,那麼sum i j sum j sum i 現在的問題是求出最大的sum i j 那麼我們可以固定sum...

HDU3415單調佇列

這題是單調佇列的典型運用。至於單調佇列,就是乙個雙端佇列,在隊首 f 出隊,在隊尾 b 出隊入隊,我們要維護整個佇列的元素是單調的,比如,我們要動態查詢從左向右的區間的最小值,那麼我們就要在佇列中維護乙個單調遞增的序列,從左向右列舉,佇列的元素還有乙個id值,代表這個元素在原序列中的位置,然後左邊的...