博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
暴搜 - Codeforces Round #327 (Div. 2) E. Three States
阅读量:5925 次
发布时间:2019-06-19

本文共 2295 字,大约阅读时间需要 7 分钟。

 E. Three States 


 

Mean: 

在一个N*M的方格内,有五种字符:'1','2','3','.','#'.

现在要你在'.'的地方修路,使得至少存在一个块'1','2'和'3'是连通的.

问:最少需要修多少个'.'的路.

analyse:

想法题,想到了就很简单.

直接暴力枚举每个国家到每个可达的点的最小代价,然后计算总和取最小值.

dis[k][x][y]表示第k个国家到达坐标(x,y)的点的最小代价.

Time complexity: O(N)

 

view code

/*
* -----------------------------------------------------------------
* Copyright (c) 2015 crazyacking All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define max(a,b) (a>b?a:b)
using
namespace
std;
typedef
long
long(
LL);
typedef
unsigned
long
long(
ULL);
const
double
eps(
1e-8);
const
int
MAXN
=
1001;
char s
[
MAXN
][
MAXN
];
int
dx
[
4
]
=
{
-
1
,
0
,
1
,
0
};
int
dy
[
4
]
=
{
0
,
-
1
,
0
,
1
};
int
dis
[
3
][
MAXN
][
MAXN
];
int
main()
{
   
ios_base
::
sync_with_stdio(
false);
   
cin
.
tie(
0);
   
int n
,
m;
   
while (
~
scanf(
"%d %d"
,
&n
,
&
m))
   
{
       
for (
int
i
=
0;
i
< n;
++
i)
           
scanf(
"%s"
, s
[
i
]);
       
for (
int
i
=
0;
i
< n;
++
i)
           
for (
int
j
=
0;
j
<
m;
++
j)
               
dis
[
0
][
i
][
j
]
=
dis
[
1
][
i
][
j
]
=
dis
[
2
][
i
][
j
]
= (
int)
1e8;
       
queue
<
pair
<
int
,
int
>
>
Q;
       
for (
int
k
=
0;
k
<
3;
++
k)
       
{
           
while (
!
Q
.
empty())
               
Q
.
pop();
           
for (
int
i
=
0;
i
< n;
++
i)
           
{
               
for (
int
j
=
0;
j
<
m;
++
j)
               
{
                   
if (s
[
i
][
j
]
==
k
+
'1')
                   
{
                       
Q
.
push(
make_pair(
i
,
j));
                       
dis
[
k
][
i
][
j
]
=
0;
                   
}
               
}
           
}
           
while (
!
Q
.
empty())
           
{
               
pair
<
int
,
int
>
now
=
Q
.
front();
               
Q
.
pop();
               
int
x
=
now
.
first;
               
int
y
=
now
.
second;
               
for (
int
i
=
0;
i
<
4;
++
i)
               
{
                   
int
xx
=
x
+
dx
[
i
];
                   
int
yy
=
y
+
dy
[
i
];
                   
if (
!(
xx
>=
0
&&
xx
< n))
continue;
                   
if (
!(
yy
>=
0
&&
yy
<
m))
continue;
                   
if (s
[
xx
][
yy
]
==
'#')
continue;
                   
if (
dis
[
k
][
xx
][
yy
]
>
dis
[
k
][
x
][
y
]
+ (s
[
x
][
y
]
==
'.'))
                   
{
                       
dis
[
k
][
xx
][
yy
]
=
dis
[
k
][
x
][
y
]
+ (s
[
x
][
y
]
==
'.');
                       
Q
.
push(
make_pair(
xx
,
yy));
                   
}
               
}
           
}
       
}
       
int
ans
=
1e9;
       
for (
int
i
=
0;
i
< n;
++
i)
       
{
           
for (
int
j
=
0;
j
<
m;
++
j)
               
ans
=
min(
ans
,
dis
[
0
][
i
][
j
]
+
dis
[
1
][
i
][
j
]
+
dis
[
2
][
i
][
j
]
+(s
[
i
][
j
]
==
'.'));
       
}
       
if (
ans
>=
1e8)
           
puts(
"-1");
       
else
           
printf(
"%d
\n
"
,
ans);
   
}
   
return
0;
}
/*
*/

 

转载地址:http://crxvx.baihongyu.com/

你可能感兴趣的文章
Oracle 11g 归档模式基本操作
查看>>
安装APK文件到Android虚拟机
查看>>
【Java例题】5.5 映射类的使用
查看>>
我的友情链接
查看>>
电影网站
查看>>
Windows Server 2012 R2 安装GUI
查看>>
RHEL7和RHEL6的版本对比
查看>>
Hadoop1的一些配置项
查看>>
我的友情链接
查看>>
RHEL5学习笔记——RH033(未完)
查看>>
mysql 中的存储过程,函数
查看>>
Python import
查看>>
JavaScript数组功能扩展--差集,并集,合集,去重
查看>>
web项目小总结
查看>>
你有没有聪明到利用云给你带来回报?
查看>>
我的友情链接
查看>>
分享有用的 Linux 命令行网络监控工具
查看>>
《.NET 编程结构》专题汇总
查看>>
MapReduce和spark的shuffle过程详解
查看>>
oracle修改MAX_STRING_SIZE,突然断电处理
查看>>