Run ID Author Problem Lang Verdict Score Time Memory Code Length Submit Time
55150 wssdr 最小生成树 (mst) C++ Accepted 100 2 MS 372 KB 1800 2022-08-09 11:39:47

Tests(10/10):


#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; }


Judgement Protocol: