消消樂 最小頂點覆蓋

2022-06-27 03:09:08 字數 1858 閱讀 5425

r神在和小b比賽玩乙個名為「消消樂」的遊戲,在乙個n*m的棋盤上,一些棋子分布在格點上,遊戲玩家有乙個名為超藍光波的**,可以消除一行或者一列的所有棋子,使用超藍光波需要耗費一點能量,消除完所有的棋子之後,花費能量越少得分越高。

r神為了超過排名第一的小b,奪得榮譽稱號「天下第一」,他需要尋求你的幫助,他希望知道最少需要使用多少次「超藍光波」,以及在哪行、哪列使用。

第一行兩個正整數n(n<=2000),m(m<=2000);

接下來n行,每行m個字元,表示棋盤,其中「.」表示該處沒有棋子,「*」表示該處有棋子,棋子個數<=100000

第一行輸出乙個正整數,表示最少需要使用的「超藍光波」次數

第二行n+1個正整數,第乙個數為n,表示需要消掉的行數,從小到大輸出每個需要消除的行號

第三行m+1個正整數,第乙個數為m,表示需要消掉的列數,從小到大輸出每個需要刪除的列號

如果有多種情況,任意輸出一種即可。

示例1

複製

3 4

.*..

**.*

.*..

複製

2

1 21 2

示例2複製

3 4

.*..

**.*

..*.

複製

3

3 1 2 3

0題意 : 每次可以消去一行或一列,問最小操作次數是多少 ?

思路分析 :

乙個比較好想到的思路就是用行和列去建立乙個二分圖,就可以轉換成乙個最小頂點覆蓋的問題了,在二分圖中他的數量又等同於最大匹配數

然後就是分別將兩側的獨立點集找到,從左側的所有未匹配的點出發,找可以到的所有的點,最後左側所有未到的點和右側所有可以到的點就是最小獨立集了

**示例 :

using namespace std;

#define ll long long

const int maxn = 1e6+5;

const int mod = 1e9+7;

const double eps = 1e-9;

const double pi = acos(-1.0);

const int inf = 0x3f3f3f3f;

int n, m;

char s[2005];

vectorve[2005];

int le[2005]; int ri[2005]; // le為左邊第i個點匹配的編號

// ri 為右邊第i個點匹配的編號

bool s[2005], t[2005];

bool fid(int x)

}return false;

}vectorx, y; // 分別用來求 兩側的最小獨立點集中的點

void mincover()

}for(int i = 1; i <= n; i++)

for(int i = 1; i <= m; i++)

}int main()

}int ans = 0;

for(int i = 1; i <= n; i++)

printf("%d\n", ans);

mincover();

printf("%d", x.size());

for(int i = 0; i < x.size(); i++) printf(" %d", x[i]);

puts("");

printf("%d", y.size());

for(int i = 0; i < y.size(); i++) printf(" %d", y[i]);

puts("");

return 0;

}

樹的最小頂點覆蓋

最小頂點覆蓋問題是演算法設計中乙個非常著名的np完全問題,下面給出頂點覆蓋問題的描述 給定乙個無向圖 g v,e 和乙個正整數k,判定是否存在乙個頂點子集如下圖所示,紅色圓圈表示其所在無向圖的乙個頂點覆蓋。第乙個圖 k 3 第二個圖 k 4 最小頂點覆蓋問題實質上就是求最小k 用k 表示最小k值 的...

樹的最小頂點覆蓋

最小頂點覆蓋問題是演算法設計中乙個非常著名的np完全問題,下面給出頂點覆蓋問題的描述 給定乙個無向圖 g v,e 和乙個正整數k,判定是否存在乙個頂點子集 其中 k,使得對於任意 有u v 或 v v 如果存在這樣的v 就稱頂點子集v 為圖g的乙個大小為k的頂點覆蓋。如下圖所示,紅色圓圈表示其所在無...

開心消消樂分析

開心消消樂的出現,帶給我新的感受。1.介面很漂亮,沒有了那種極簡風格。2.利用了qq的關係,加入社交元素,向好友求助等功能使人們把自己的好友拉進來一起玩。3.遊戲中限制很多,每天一開始預設發30個精力值,每玩一關就消耗5個精力值。當精力值沒有的時候,可以向好友求助,每個好友可以傳送乙個精力值給你,而...