Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
55101 | alex_liu | 最小生成树 (mst) | C++ | 通过 | 100 | 3 MS | 512 KB | 2112 | 2022-08-09 11:30:36 |
#include<bits/stdc++.h> #define int long long using namespace std; const int dx[5]={0,0,0,1,-1},dy[5]={0,1,-1,0,0}; inline int read(){ int x=0,f=0;char c=getchar(); while(c<48||c>57)f|=(!(c^'-')),c=getchar(); while(c>=48&&c<=57)x=(x<<1)+(x<<3)+(c^48),c=getchar(); return f?-x:x; } struct node{int x,y;}; vector<node>v[3]; int n,m,cnt=1,vis[55][55],b[3],minn=0x7f7f7f7f,allmin=0x7f7f7f7f,now; char c[55][55]; inline bool check(int x,int y){ if(x<1||x>n||y<1||y>m)return 0; return 1; } inline void dfs(int x,int y,int num){ if(vis[x][y]||c[x][y]^'X')return; vis[x][y]=num; v[num-1].push_back((node){x,y}); for(int i=1;i<=4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(check(nx,ny))dfs(nx,ny,num); } } signed main(){ n=read(),m=read(); memset(b,127,sizeof b); for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>c[i][j]; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(!(vis[i][j]^0)&&!(c[i][j]^'X'))dfs(i,j,cnt),cnt++; } } for(int i=0;i<v[0].size();i++){ for(int j=0;j<v[1].size();j++){ b[0]=min(b[0],abs(v[0][i].x-v[1][j].x)+abs(v[0][i].y-v[1][j].y)-1); } } for(int i=0;i<v[0].size();i++){ for(int j=0;j<v[2].size();j++){ b[1]=min(b[1],abs(v[0][i].x-v[2][j].x)+abs(v[0][i].y-v[2][j].y)-1); } } for(int i=0;i<v[1].size();i++){ for(int j=0;j<v[2].size();j++){ b[2]=min(b[2],abs(v[1][i].x-v[2][j].x)+abs(v[1][i].y-v[2][j].y)-1); } } sort(b,b+3); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(!(c[i][j]^'.')){ for(int k=0;k<v[0].size();k++)minn=min(minn,abs(i-v[0][k].x)+abs(j-v[0][k].y)); now=minn;minn=0x7f7f7f7f; for(int k=0;k<v[1].size();k++)minn=min(minn,abs(i-v[1][k].x)+abs(j-v[1][k].y)); now+=minn;minn=0x7f7f7f7f; for(int k=0;k<v[2].size();k++)minn=min(minn,abs(i-v[2][k].x)+abs(j-v[2][k].y)); now+=minn;minn=0x7f7f7f7f; allmin=min(allmin,now-2); } } } cout<<min(b[0]+b[1],allmin)<<endl; // cout<<b[0]<<endl<<b[1]<<endl<<b[2]<<endl; // for(int i=1;i<=n;i++){ // for(int j=1;j<=m;j++)cout<<vis[i][j]<<" "; // puts(""); // } return 0; }