codeforces 590C C. Three States(bfs+连通块之间的最短距离)
题目链接:
5 seconds
512 megabytes
standard input
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.
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.
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.
4 5
11..2
#..22
#.323
.#333
2
1 5
1#2#3
-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+连通块之间的最短距离)的更多相关文章
- C. Edgy Trees Codeforces Round #548 (Div. 2) 【连通块】
一.题面 here 二.分析 这题刚开始没读懂题意,后来明白了,原来就是一个数连通块里点数的问题.首先在建图的时候,只考虑红色路径上的点.为什么呢,因为为了不走红色的快,那么我们可以反着想只走红色的路 ...
- CodeForces 690D1 The Wall (easy) (判断连通块的数量)
题意:给定一个图,问你有几个连通块. 析:不用说了,最简单的DFS. 代码如下: #include <bits/stdc++.h> using namespace std; const i ...
- D. Lakes in Berland (DFS或者BFS +连通块
https://blog.csdn.net/guhaiteng/article/details/52730373 参考题解 http://codeforces.com/contest/723/prob ...
- DFS or BFS --- 连通块
Oil Deposits Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 Descrip ...
- 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 ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- 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 ...
- 【BZOJ 1098】办公楼(补图连通块个数,Bfs)
补图连通块个数这大概是一个套路吧,我之前没有见到过,想了好久都没有想出来QaQ 事实上这个做法本身就是一个朴素算法,但进行巧妙的实现,就可以分析出它的上界不会超过 $O(n + m)$. 接下来介绍一 ...
- ZOJ 3781 Paint the Grid Reloaded(DFS连通块缩点+BFS求最短路)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5268 题目大意:字符一样并且相邻的即为连通.每次可翻转一个连通块X( ...
随机推荐
- ASP.NET读取配置文件发送邮件
之前写过一篇文章C#使用SMTP发送邮件 后来做了改进,改成读取独立的配置文件,本文只记录读取配置文件的部分,发送部分见上面的链接. 读取配置文件C#代码: using System; using S ...
- 计数排序详解以及java实现
前言 我们知道,通过比较两个数大小来进行排序的算法(比如插入排序,合并排序,以及上文提到的快速排序等)的时间复杂度至少是Θ(nlgn),这是因为比较排序对应的决策树的高度至少是Θ(nlgn),所以排序 ...
- Visual Studio无法添加断点
今天在写代码的时候突然发现无法添加断点,更加详细的场景是“按F9可以添加调试行,但是断点不显示,且显示代码行数左边的灰色区域不见了”找了各种方法也没有解决,然后重启.修复甚至重装都不行,最后在万千网页 ...
- Flex SuperTabNavigator Tab标签图片不显示或图片显示不完全
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- VS2015生成64位dll文件
导入自己的源文件,准备生成DLL文件.也可以自己创建. 右键项目,进入属性,修改Configuration Type 为 DLL. 修改为64位,Configureation Manager -> ...
- c#委托把方法当成参数
//定义委托,它定义了可以代表的方法的类型 public delegate void GreetingDelegate(string name); /// <summary> /// 用英 ...
- uva301 - Transportation
Transportation Ruratania is just entering capitalism and is establishing new enterprising activiti ...
- js中的this和apply
this是js的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. 1.纯粹函数调用. function test() { this. ...
- SCVMM之Windows Server2012 R2新功能
在Windows Server 2012 R2中可以通过使用共享的虚拟硬盘VHDX文件的方法来模拟IP SAN,来为虚拟机创建群集提供共享存储.这样为虚拟机创建群集时就不用再像以前一样通过使用软件模拟 ...
- cdoj 24 8球胜负(eight) 水题
8球胜负(eight) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/24 ...