codeforces 590C:(BFS)

建道路使得三个国家联通,问最少需要在多少个格子上修路

枚举每一个格子,计算三个国家到达这个格子的最短路,取最小的

发现pair用来代替node有时候还是很好用的

#include"cstdio"
#include"queue"
#include"cmath"
#include"stack"
#include"iostream"
#include"algorithm"
#include"cstring"
#include"map"
#include"queue"
#include"vector"
#define ll long long

using namespace std;
const int MAXN = 1050;
const int MAXE = 400050;
const int INF = 1e8;

char mat[MAXN][MAXN];
int dis[3][MAXN][MAXN];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,1,-1};
int n,m;

bool ing(int i,int j){
    if(i<0||i>=n) return false;
    if(j<0||j>=m) return false;
    return true;
}

void solve(char a){
    queue<pair<int,int> >q;
    while(!q.empty()) q.pop();
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++) if(mat[i][j]==a){
        q.push(pair<int,int>(i,j));
        dis[a-‘1‘][i][j]=0;
    }
    while(!q.empty()){
        pair<int,int> t=q.front();q.pop();
        for(int i=0;i<4;i++){
            int tx=t.first+dx[i];
            int ty=t.second+dy[i];

            if(!ing(tx,ty)||mat[tx][ty]==‘#‘) continue;
            if(dis[a-‘1‘][tx][ty]>dis[a-‘1‘][t.first][t.second]+(mat[t.first][t.second]==‘.‘)){
                dis[a-‘1‘][tx][ty]=dis[a-‘1‘][t.first][t.second]+(mat[t.first][t.second]==‘.‘);
                q.push(pair<int,int>(tx,ty));
            }
        }
    }
}

int main(){
    scanf("%d%d",&n,&m);
    for(int k=0;k<3;k++)
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++) dis[k][i][j]=INF;

    for(int i=0;i<n;i++) scanf("%s",mat[i]);
    for(int i=0;i<3;i++) solve(i+‘1‘);
    int ans=INF*3;
    //solve(‘1‘);
    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]+(mat[i][j]==‘.‘));
    if(ans>=INF) printf("-1\n");
    else printf("%d\n",ans);
    return 0;
}

时间: 2024-12-07 18:25:30

codeforces 590C:(BFS)的相关文章

CodeForces 590C Three States BFS

Three Statesy 题解: 以3个大陆为起点,都dfs一遍,求出该大陆到其他点的最小距离是多少, 然后枚举每个点作为3个大陆的路径交点. 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); #define LL

CodeForces 796D bfs

CodeForces 796D 题意:n个城市,k个警察局,n-1条边连成树,所有边长都为1,给定的图满足规则:任一城市到离它最近的警察局距离不超过d. 问你最多可以删掉多少条边,使得依旧满足规则. tags:从所有警察局开始一起bfs,这样当要走向一个点to的时候,肯定是离警察局最近的路.如果to没有走过,就说明这条边 i 是需要的,标记它.最后没有被标记到的边就是不需要的.  注意坑点:d 可以为0 #include<bits/stdc++.h> using namespace std;

CodeForces 789E bfs建模,思维

CodeForces 789E 题意:有k种可乐,每种的测试为ai/1000. 要你合成一种浓度为n/1000的可乐,问最小要杯可乐,每种可乐可重复取. tags:  要注意到浓度绝不会超过1000/1000. 假设选取m杯可乐,则 (a1+a2+......+am) / m = n,变换一下为(a1-n)+(a2-n)+......+(am-n) = 0.即要选 m杯可乐,其浓度减 n之和为0.而浓度不超过1000,故(a1-n)+(a2-n)+....+(as-n)的和肯定在 -1000~1

Codeforces Gym 100187E E. Two Labyrinths bfs

E. Two Labyrinths Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/E Description A labyrinth is the rectangular grid, each of the cells of which is either free or wall, and it's possible to move only between free

Codeforces 788C The Great Mixing(背包问题建模+bitset优化或BFS)

[题目链接] http://codeforces.com/problemset/problem/788/C [题目大意] 给出一些浓度的饮料,要求调出n/1000浓度的饮料,问最少需要多少升饮料 [题解] 设浓度为a,现在要求出系数x1,x2,x3……,使得x1*a1+x2*a2+x3*a3+……=n*(x1+x2+x3+……) 得a1*(x1-n)+a2*(x2-n)+a3*(x3-n)+……=0 假设现在有x1-n和x2-n,设其数值为x和y,那么一定有(x)*y+(-y)*x=0, x+y

Educational Codeforces Round 1(D. Igor In the Museum) (BFS+离线访问)

题目链接:http://codeforces.com/problemset/problem/598/D 题意是 给你一张行为n宽为m的图 k个询问点 ,求每个寻问点所在的封闭的一个上下左右连接的块所能看到的壁画有多少(大概这样吧). 我的做法是bfs(dfs也可以)这个为'.'的点,要是遇到上下左右其中有'*'的话就加起来.要是每次询问然后bfs一下肯定超时,所以我用一个ans[1005][1005]记录每个点的值,ok[1005][1005]数组判断是否访问过,初始化为false.然后开始遍历

BFS Codeforces Round #297 (Div. 2) D. Arthur and Walls

题目传送门 1 /* 2 题意:问最少替换'*'为'.',使得'.'连通的都是矩形 3 BFS:搜索想法很奇妙,先把'.'的入队,然后对于每个'.'八个方向寻找 4 在2*2的方格里,若只有一个是'*',那么它一定要被替换掉 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <algorithm> 9 #include <cstring> 10 #include <queue> 1

Codeforces 467D Fedor and Essay(bfs)

题目链接:Codeforces 467D Fedor and Essay 题目大意:给定一个含n个单词的文本,然后给定m种变换,要求变换后r的个数尽量少,长度尽量短,不区分大小写. 解题思路:bfs,将每个单词处理成长度以及r的个数,然后从最优的开始更新即可,类似dp. #include <cstdio> #include <cstring> #include <map> #include <string> #include <vector> #

Codeforces 429B Working out bfs构造

题目链接:点击打开链接 题意:给定n*m的矩阵 有一个人a从左上角走到右下角,只能↓或→走 另一个人b从左下角走到右上角,只能↑或→走 使得2个人的路径有且仅有一个格子是相交的. 统计2个人的权值和(相交格子的权值和不计) 问最大的权值和是多少. 思路: 首先转换一下题意,也就是找一个格子与4个角落连不相交的线. 我们观察相交的那个格子,那个格子的上下左右必然对应着一个角落. (i,j)点,那么(i-1,j)必然对应左上角或右上角的其中一个角落. 这样(i,j)点的4个相邻格子各自对应一个角落(