2017年蓝桥杯模拟赛-9引爆炸弹


                         1000ms 131072K

在一个 n×mn \times mn×m 的方格地图上,某些方格上放置着炸弹。手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去。

现在为了引爆地图上的所有炸弹,需要手动引爆其中一些炸弹,为了把危险程度降到最低,请算出最少手动引爆多少个炸弹可以把地图上的所有炸弹引爆。

输入格式

第一行输两个整数 n,mn,mn,m,用空格隔开。

接下来 nnn 行,每行输入一个长度为 mmm 的字符串,表示地图信息。0表示没有炸弹,1表示炸弹。

数据约定:

对于 60%60\%60% 的数据:1≤n,m≤1001 \le n, m \le 1001n,m100

对于 100%100\%100% 的数据:1≤n,m≤1000 1 \le n, m \le 10001n,m1000

数据量比较大,不建议用cin输入。

输出格式

输出一个整数,表示最少需要手动引爆的炸弹数。

样例输入

5 5
00010
00010
01001
10001
01000

样例输出

2
 
   

样例的方法如下:先引手动引爆一个炸弹,红色的手动引爆,绿色的是间接引爆。

2017年蓝桥杯模拟赛-9引爆炸弹_第1张图片

然后再手动引爆一个炸弹:

2017年蓝桥杯模拟赛-9引爆炸弹_第2张图片

因此最少需要手动引爆两枚炸弹。


思路:并查集

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1005;
struct edge {
    int from,to;
}Edge[maxn*maxn];
int pre[maxn];
bool cmp(const edge &a, const edge &b) {
    if(a.from==b.from) return a.to ans;
    for(int i=0;i



你可能感兴趣的:(2017年蓝桥杯模拟赛-9引爆炸弹)