建道路使得三个国家联通,问最少需要在多少个格子上修路
枚举每一个格子,计算三个国家到达这个格子的最短路,取最小的
发现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