r神在和小b比賽玩乙個名為「消消樂」的遊戲,在乙個n*m的棋盤上,一些棋子分布在格點上,遊戲玩家有乙個名為超藍光波的**,可以消除一行或者一列的所有棋子,使用超藍光波需要耗費一點能量,消除完所有的棋子之後,花費能量越少得分越高。
r神為了超過排名第一的小b,奪得榮譽稱號「天下第一」,他需要尋求你的幫助,他希望知道最少需要使用多少次「超藍光波」,以及在哪行、哪列使用。
第一行兩個正整數n(n<=2000),m(m<=2000);接下來n行,每行m個字元,表示棋盤,其中「.」表示該處沒有棋子,「*」表示該處有棋子,棋子個數<=100000
第一行輸出乙個正整數,表示最少需要使用的「超藍光波」次數示例1第二行n+1個正整數,第乙個數為n,表示需要消掉的行數,從小到大輸出每個需要消除的行號
第三行m+1個正整數,第乙個數為m,表示需要消掉的列數,從小到大輸出每個需要刪除的列號
如果有多種情況,任意輸出一種即可。
複製
3 4.*..
**.*
.*..
複製
21 21 2
示例2複製
3 4.*..
**.*
..*.
複製
33 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個精力值。當精力值沒有的時候,可以向好友求助,每個好友可以傳送乙個精力值給你,而...