The road has made three countries Unicom, asking at least how many grids to build roads
Enumerate each lattice, calculate the shortest possible three countries to reach this lattice, take the smallest
Find pair used instead of node and sometimes it works.
#include"Cstdio"#include"Queue"#include"Cmath"#include"Stack"#include"iostream"#include"algorithm"#include"CString"#include"Map"#include"Queue"#include"Vector"#definell Long Longusing namespacestd;Const intMAXN =1050;Const intMaxe =400050;Const intINF =1e8;CharMAT[MAXN][MAXN];intdis[3][MAXN][MAXN];intdx[4]={-1,1,0,0};intdy[4]={0,0,1,-1};intn,m;BOOLingintIintj) { if(i<0|| I>=n)return false; if(j<0|| J>=M)return false; return true;}voidSolveChara) {Queue<pair<int,int> >Q; while(!q.empty ()) Q.pop (); for(intI=0; i<n;i++) for(intj=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(intI=0;i<4; i++){ inttx=t.first+Dx[i]; intTy=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)); } } }}intMain () {scanf ("%d%d",&n,&m); for(intk=0;k<3; k++) for(intI=0; i<n;i++) for(intj=0; j<m;j++) dis[k][i][j]=INF; for(intI=0; i<n;i++) scanf ("%s", Mat[i]); for(intI=0;i<3; i++) Solve (i+'1'); intans=inf*3; //solve (' 1 '); for(intI=0; i<n;i++) for(intj=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"); Elseprintf"%d\n", ans); return 0;}View Code
Codeforces 590C: (BFS)