题目链接:

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. UserControl和CustomControl基础【PluraSight】

    UserControl UserControl实际上就是ContentControl,xaml里<UserControl></UserControl>tag之间包含的实际就是后 ...

  2. 移动端类似IOS的滚动年月控件(需要jQuery和iScroll)

    一. 效果图 二. 功能介绍 支持滚动和点击选择年月.(目前只支持设置年月的最大最小值,不支持整体的最大最小值) 三. 代码 1. 在你的html中添加如下代码: 直接加载<body>里面 ...

  3. iOS开发-HTTP请求

    什么是URL?URL就是资源的地址.位置,互联网上的每个资源都有一个唯一的URLURL的基本格式: URL中常见的协议 (1)HTTP 超文本传输协议,访问的是远程的网络资源,格式是http:// h ...

  4. 上门洗车App 竟然是块大肥肉!

    http://www.leiphone.com/k-xiche-app-idea.html 打车App.租车App.防违规App我们见得多,但洗车App你一定没听过,之前在一次创业路演上碰到一个做上门 ...

  5. Flex4 DataGrid ItemRenderer内嵌方式

    Flex4 DataGrid ItemRenderer像Flex3一直内嵌ItemRenderer会报空对象引用的错误,如: <s:GridColumn dataField="titl ...

  6. IE下实现类似CSS3 text-shadow文字阴影的几种方法

    IE下实现类似CSS3 text-shadow文字阴影的几种方法 一.开始的擦边话 为了测试IE9浏览器,下午晃晃荡荡把系统换成window7的了.果然,正如网上所传言的一样,IE9浏览器确实不支持C ...

  7. 【M25】将构造方法和非成员方法虚化

    1.所谓虚化,就是根据引用或者指针的真实类型,决定调用哪个方法. 2.构造方法虚化,就是根据引用(或者指针)的真实类型,构造出一个对象,如果指针的真实类型是Base,返回Base*:如果指针的真实类型 ...

  8. hdu 5264 pog loves szh I 水题

    pog loves szh I Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

  9. 【机器学习算法-python实现】决策树-Decision tree(1) 信息熵划分数据集

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 决策书算法是一种逼近离散数值的分类算法,思路比較简单,并且准确率较高.国际权威的学术组织,数据挖掘国际 ...

  10. Editor Scripting学习笔记之Menu Item

    主要用到: MenuItem属性 MenuCommand参数 可能用到: EditorApplication类 Selection类 GameObjectUtility类 FileUtil类 Undo ...