zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    统计学习方法学习笔记(一)--极大似然估计与贝叶斯估计原理及区别
    数据过拟合解决方法
    LSTM基础
    异方差产生与解决
    人工免疫相关算法
    Svm相关
    sscanf,sscanf_s及其相关用法
    C语言数组初始化
    生产者和消费者
    Linux线程-创建
  • 原文地址:https://www.cnblogs.com/luxiaoming/p/5069477.html
Copyright © 2011-2022 走看看