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
");
    else printf("%d
",ans);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/luxiaoming/p/5069477.html