Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
55150 | wssdr | 最小生成树 (mst) | C++ | 通过 | 100 | 2 MS | 372 KB | 1800 | 2022-08-09 11:39:47 |
#include<bits/stdc++.h> using namespace std; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int n,m,a[55][55],S[55][55],tot; vector <pair <int,int> > vec[5]; int ans1,ans2,ans3,res1,res2,res3,fuck; void GET(int x,int y,int k){ if(x>n||x<1||y>m||y<1||S[x][y]) return; if(a[x][y]){ if(!a[x+1][y]||!a[x-1][y]||!a[x][y+1]||!a[x][y-1]) vec[k].push_back(make_pair(x,y)); S[x][y]=k; } else return; for(int i(0);i<4;++i) GET(x+dir[i][0],y+dir[i][1],k); } inline int Calc(pair <int,int> x,pair <int,int> y){ return abs(x.first-y.first)+abs(x.second-y.second)-1; } int main(){ // freopen("mst.in","r",stdin); // freopen("mst.out","w",stdout); scanf("%d%d",&n,&m); for(int i(1);i<=n;++i) for(int j(1);j<=m;++j){ char c(getchar()); while((c^'.')&&(c^'X')) c=getchar(); a[i][j]=(c=='X'); } for(int i(1);i<=n;++i) for(int j(1);j<=m;++j) if(a[i][j]&&!S[i][j]) GET(i,j,++tot); ans1=ans2=ans3=INT_MAX; for(int i(0);i<vec[1].size();++i) for(int j(0);j<vec[2].size();++j) ans1=min(ans1,Calc(vec[1][i],vec[2][j])); for(int i(0);i<vec[1].size();++i) for(int j(0);j<vec[3].size();++j) ans2=min(ans2,Calc(vec[1][i],vec[3][j])); for(int i(0);i<vec[2].size();++i) for(int j(0);j<vec[3].size();++j) ans3=min(ans3,Calc(vec[2][i],vec[3][j])); fuck=INT_MAX; for(int i(1);i<=n;++i) for(int j(1);j<=m;++j){ res1=res2=res3=INT_MAX; for(int k(0);k<vec[1].size();++k) res1=min(res1,Calc(make_pair(i,j),vec[1][k])); for(int k(0);k<vec[2].size();++k) res2=min(res2,Calc(make_pair(i,j),vec[2][k])); for(int k(0);k<vec[3].size();++k) res3=min(res3,Calc(make_pair(i,j),vec[3][k])); fuck=min(fuck,res1+res2+res3+1); } printf("%d\n",min(fuck,ans1+ans2+ans3-max(ans1,max(ans2,ans3)))); return 0; }