hdu1281結題報告

2021-09-08 16:53:05 字數 1212 閱讀 7553

哎哎...自己剛剛一看到這個題目居然。。。。。什麼都想不到...看了一下別人的解題報告說最大匹配...於是就自己開始構思啦...

對於這個棋盤,有k個可以放棋子的位置....那麼

首先我們開始可以求出這k個位置能放的最多棋子

這個就是最大匹配啦..一開始自己老是想不到怎麼匹配....可以這樣想,用這個棋盤的行與列匹配,因為車要不相互攻擊,那麼意味著每行每列只能放乙個,一旦乙個棋子放在了x , y座標位置,那麼第x行第y列就不能再放其他棋子,放了的這個棋子,就把x和y連成一條邊...如果還是不理解可以看如下圖(結合題目案例1)

那麼現在可以知道可以放置的最多棋子就是最大二分匹配,我們先存為flag

然後就是處理重要點:

其實也比較簡單,我們對於這k個點,一一考慮,去掉這個點,再求一次最大匹配,如果這次的最大匹配小於flag,那麼可以知道,這個點就是重要點(可以考慮案例1,無論去掉哪乙個點之後的最大匹配任然是2)

附上**:一開始還擔心會超時,但是居然沒有,哎哎,不過看著題目排名,好多人都是0k 0ms。。。卻不見乙個人拿出來分享一下題解.....只給人留下羨慕的份

// 46ms 244k 

#include#include#define max 101

int n,m,k;

int node[max*max][2];//點先存起來,後面去點判斷要用到node[i][0]表示第i個點的x座標。node[i][1]表示第i個點的y座標

bool map[max][max];//棋盤

int link[max];

bool useif[max];

bool dfs(int t)

} }return false;

}int match()

return sum;

}int main()

{ int i;

int cas=1;

while(~scanf("%d%d%d",&n,&m,&k))

{ memset(map,0,sizeof(map));

for(i=0;i

圖畫的很爛...不要噴

總結:對於這類問題的轉換思維還是狠狠不夠...要努力

hdu 1281 棋盤遊戲

題意 在保證盡量多的 車 的前提下,棋盤裡有些格仔是可以避開的,也就是說,不在這些格仔上放車,也可以保證盡量多的 車 被放下 車不互相攻擊 但是某些格仔若不放子,就無法保證放盡量多的 車 這樣的格仔被稱做重要點。算出有多少個這樣的重要點。解 建立乙個二分圖,若 i,j 可以放旗子就連邊,求出最小點覆...

HDU 1281 棋盤遊戲

思路 參考的大神的,把棋盤的橫座標看做x,縱座標看做y,棋盤中的乙個格仔看做二分圖中兩個集合的一條邊,題目的條件是任意兩個 車 不能在同一行且不在同一列,也就是兩個集合中每個點都只能連線一條邊,這正好滿足最大匹配,然後列舉每個位置不放 車 的情況下,得出的最大匹配是否等於放 車 時的解,如果不等於,...

HDU 1281 棋盤遊戲

中問題,就不說題意了。解 典型的行列匹配問題。車 放在同一行或列肯定不行,那麼我們抽象出x集合為行號,y集合為列號,由於x集合中頂點不能連邊,y集合中頂點不能連邊。只有x集合與y集合才能連邊,那就是二分圖咯。我們把能放棋的點 i,j 連條邊 i j 因為對於某一行,它有m列,但是這一行他最多放乙個棋...