题目链接:

C. Three States

time limit per test

5 seconds

memory limit per test

512 megabytes

input

standard input

output

standard output

The famous global economic crisis is approaching rapidly, so the states of Berman, Berance and Bertaly formed an alliance and allowed the residents of all member states to freely pass through the territory of any of them. In addition, it was decided that a road between the states should be built to guarantee so that one could any point of any country can be reached from any point of any other State.

Since roads are always expensive, the governments of the states of the newly formed alliance asked you to help them assess the costs. To do this, you have been issued a map that can be represented as a rectangle table consisting of n rows and m columns. Any cell of the map either belongs to one of three states, or is an area where it is allowed to build a road, or is an area where the construction of the road is not allowed. A cell is called passable, if it belongs to one of the states, or the road was built in this cell. From any passable cells you can move up, down, right and left, if the cell that corresponds to the movement exists and is passable.

Your task is to construct a road inside a minimum number of cells, so that it would be possible to get from any cell of any state to any cell of any other state using only passable cells.

It is guaranteed that initially it is possible to reach any cell of any state from any cell of this state, moving only along its cells. It is also guaranteed that for any state there is at least one cell that belongs to it.

 
Input
 

The first line of the input contains the dimensions of the map n and m (1 ≤ n, m ≤ 1000) — the number of rows and columns respectively.

Each of the next n lines contain m characters, describing the rows of the map. Digits from 1 to 3 represent the accessory to the corresponding state. The character '.' corresponds to the cell where it is allowed to build a road and the character '#' means no construction is allowed in this cell.

 
Output
 

Print a single integer — the minimum number of cells you need to build a road inside in order to connect all the cells of all states. If such a goal is unachievable, print -1.

 
Examples
 
input
4 5
11..2
#..22
#.323
.#333
output
2
input
1 5
1#2#3
output
-1

题意:

给这样的一个图,问所有的编号1,2,3,的点时候连通,如果没有连通那么最少要把多少个点.变成数字才会连通;保证编号相同的点是连通的,而且编号相同的点之间距离相当于0;

思路:

先bfs一遍看是否连通,并把可以连通的.标记出来,然后分别以编号1,2,3的点为起点bfs,找到每个点到编号为1,2,3的点的最短距离,最后找答案的时候再扫一遍,
这点到编号1,2,3的最短距离和的最小值; AC代码:
//#include <bits/stdc++.h>
#include <vector>
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <cstring>
#include <algorithm>
#include <cstdio> using namespace std;
#define Riep(n) for(int i=1;i<=n;i++)
#define Riop(n) for(int i=0;i<n;i++)
#define Rjep(n) for(int j=1;j<=n;j++)
#define Rjop(n) for(int j=0;j<n;j++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
typedef long long LL;
template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<''||CH>'';F= CH=='-',CH=getchar());
for(num=;CH>=''&&CH<='';num=num*+CH-'',CH=getchar());
F && (num=-num);
}
int stk[], tp;
template<class T> inline void print(T p) {
if(!p) { puts(""); return; }
while(p) stk[++ tp] = p%, p/=;
while(tp) putchar(stk[tp--] + '');
putchar('\n');
} const LL mod=1e9+;
const double PI=acos(-1.0);
const LL inf=1e14;
const int N=5e5+;
int n,m,cnt;
char s[][];
int vis[][],dis[][][],flag[][];
int dir[][]={,,,-,,,-,};
int dp[][]; struct node
{
int x,y;
};
node temp;
void makepo(int a,int b)
{
temp.x=a,temp.y=b;
} queue<node>qu;
vector<node>ve[];
int bfs(int x,int y)
{
makepo(x,y);
vis[x][y]=;
flag[x][y]=;
qu.push(temp);
while(!qu.empty())
{
node fr=qu.front();
qu.pop();
if(s[fr.x][fr.y]!='.')cnt--;
for(int i=;i<;i++)
{
int fx=dir[i][]+fr.x,fy=dir[i][]+fr.y;
if(fx<||fx>n||fy<||fy>m)continue;
if(!vis[fx][fy]&&s[fx][fy]!='#')
{
vis[fx][fy]=;
flag[fx][fy]=;
makepo(fx,fy);
qu.push(temp);
}
}
}
if(cnt==)return ;
return ;
} void BFS(int start)
{
while(!qu.empty())qu.pop();
mst(vis,);
int len=ve[start].size();
for(int i=;i<len;i++)
{
node q=ve[start][i];
dis[start][q.x][q.y]=;
vis[q.x][q.y]=;
qu.push(q);
}
while(!qu.empty())
{
node fr=qu.front();
qu.pop(); for(int i=;i<;i++)
{
int fx=dir[i][]+fr.x,fy=dir[i][]+fr.y;
if(fx<||fx>n||fy<||fy>m)continue;
if(s[fx][fy]!='#'&&!vis[fx][fy])
{ if(s[fx][fy]>''&&s[fx][fy]<''&&s[fx][fy]!=''+start)
{
int c=s[fx][fy]-'';
int len=ve[c].size();
for(int j=;j<len;j++)
{
int ffx=ve[c][j].x,ffy=ve[c][j].y;
dis[start][ffx][ffy]=dis[start][fr.x][fr.y]+;
makepo(ffx,ffy);
vis[ffx][ffy]=;
qu.push(temp);
}
}
else {
vis[fx][fy]=;
dis[start][fx][fy]=dis[start][fr.x][fr.y]+;
makepo(fx,fy);
qu.push(temp);}
}
}
}
} int main()
{
int x,y;
read(n);read(m);
Riep(n)scanf("%s",s[i]+);
cnt=;
Riep(n)
{
Rjep(m)
{
if(s[i][j]==''||s[i][j]==''||s[i][j]=='')
{
makepo(i,j);
ve[s[i][j]-''].push_back(temp);
x=i,y=j;
cnt++;
}
}
}
if(bfs(x,y)){cout<<"-1"<<"\n";return ;}
BFS();
BFS();
BFS();
int ans=1e9;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(s[i][j]!='#'&&flag[i][j])
ans=min(ans,dis[][i][j]+dis[][i][j]+dis[][i][j]-);
}
}
cout<<ans<<"\n";
return ;
}

codeforces 590C C. Three States(bfs+连通块之间的最短距离)的更多相关文章

  1. C. Edgy Trees Codeforces Round #548 (Div. 2) 【连通块】

    一.题面 here 二.分析 这题刚开始没读懂题意,后来明白了,原来就是一个数连通块里点数的问题.首先在建图的时候,只考虑红色路径上的点.为什么呢,因为为了不走红色的快,那么我们可以反着想只走红色的路 ...

  2. CodeForces 690D1 The Wall (easy) (判断连通块的数量)

    题意:给定一个图,问你有几个连通块. 析:不用说了,最简单的DFS. 代码如下: #include <bits/stdc++.h> using namespace std; const i ...

  3. D. Lakes in Berland (DFS或者BFS +连通块

    https://blog.csdn.net/guhaiteng/article/details/52730373 参考题解 http://codeforces.com/contest/723/prob ...

  4. DFS or BFS --- 连通块

    Oil Deposits Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 Descrip ...

  5. Codeforces 987 K预处理BFS 3n,7n+1随机结论题/不动点逆序对 X&Y=0连边DFS求连通块数目

    A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...

  6. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

  7. ZOJ 3781 - Paint the Grid Reloaded - [DFS连通块缩点建图+BFS求深度][第11届浙江省赛F题]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3781 Time Limit: 2 Seconds      Me ...

  8. 【BZOJ 1098】办公楼(补图连通块个数,Bfs)

    补图连通块个数这大概是一个套路吧,我之前没有见到过,想了好久都没有想出来QaQ 事实上这个做法本身就是一个朴素算法,但进行巧妙的实现,就可以分析出它的上界不会超过 $O(n + m)$. 接下来介绍一 ...

  9. ZOJ 3781 Paint the Grid Reloaded(DFS连通块缩点+BFS求最短路)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5268 题目大意:字符一样并且相邻的即为连通.每次可翻转一个连通块X( ...

随机推荐

  1. (剑指Offer)面试题23:从上到下打印二叉树

    题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 很明显,这是一个广度优先遍历. 需要一个队列容器来保存结点,具体操作: 1.将根结点压入队列中,并打印根结点:如果根结点有子结点 ...

  2. MON166 User's Guide

    MON166 is a debug monitor for C16x and ST10 user programs. It consists of: A configurable monitor pr ...

  3. Android图片圆角效果

    一般来说图片加圆角可以使用 Java 的方式来进行, 对图片略加处理即可, 但也可以使用纯XML+Nice-Patch图片来进行, 这样的速度会更快. 如果背景是纯色的情况下建议使用此方法. 原理则是 ...

  4. mybatis 报错:Caused by: java.lang.NumberFormatException: For input string

    mybatis的if标签之前总是使用是否为空,今天要用到字符串比较的时候遇到了困难,倒腾半天,才在一个论坛上找到解决方法.笔记一下,如下: 转自:https://code.google.com/p/m ...

  5. memached+asp.net 4.0 分布式缓存

    由于准备做一个商品站点,希望做一个memached缓存.折腾了一个多星期.本机是存进去取出来为空. 各种办法都试过了,还是不行.最后用同事电脑測试是能够的,然后将DEMO公布到阿里云也是能够的.支持. ...

  6. 开机就提示“请安装TCP/IP协议,error=10106”的解决的方法

    一.问题描写叙述: 今天开机时提示"请安装TCP/IP协议,error=10106",现象是popo,qq等登录不了,IE浏览器等连不了网,使用ping命令ping其它机器和路由器 ...

  7. 获取div相对文档的位置

    获取div相对文档的位置,两个方法 经测试 document.getElementById("btn").getBoundingClientRect() 在IE6下有2像素的bug ...

  8. String当中的高效函数(优化)

    1. indexOf()函数是一个执行速度非常快的函数,可以用其与subString()实现高效的字符串分割,比内置的要高效. 2. charAt()方法也是高效率的函数,可以用其实现高效的start ...

  9. go can't find import: "github.com/** 错误

    go get 后 go build 错误 can't find import: "github.com/ 原因: 1.gopath 没配好 2.go get 后要先 go install , ...

  10. Java连接mysql数据库并进行内容查询

    最近用框架做了几个项目,感觉当初底层的东西有点忘了,写一个JDBC的简单的连接代码来熟悉回顾一下,也希望对刚接触的新手能有所帮助.这也是我的第一篇随笔,废话不多说,直接上代码: public Conn ...