Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
119022 | 陈家宝 | 最小生成树 (mst) | C++ | 通过 | 100 | 3 MS | 408 KB | 1606 | 2024-01-03 13:24:59 |
#include<bits/stdc++.h> using namespace std; int n,m,ans1=1145141919,ans2=1145141919,ans3=1145141919,ans4=1145141919; char s[55][55]; vector<pair<int,int> >v[3]; void dfs(int x,int y,char c,int cnt){ s[x][y]=c,v[cnt].push_back(make_pair(x,y)); if(x<n&&s[x+1][y]=='X')dfs(x+1,y,c,cnt); if(x>1&&s[x-1][y]=='X')dfs(x-1,y,c,cnt); if(y<m&&s[x][y+1]=='X')dfs(x,y+1,c,cnt); if(y>1&&s[x][y-1]=='X')dfs(x,y-1,c,cnt); } void floodfill(int cnt=0){ for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(s[i][j]=='X')cnt++,dfs(i,j,(char)(cnt+48),cnt-1); } int dis(pair<int,int>a,pair<int,int>b){ return abs(a.first-b.first)+abs(a.second-b.second)-1; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>s[i][j]; floodfill(); for(int i=0;i<v[0].size();i++)for(int j=0;j<v[1].size();j++)ans1=min(ans1,dis(v[0][i],v[1][j])); for(int i=0;i<v[0].size();i++)for(int j=0;j<v[2].size();j++)ans2=min(ans2,dis(v[0][i],v[2][j])); for(int i=0;i<v[1].size();i++)for(int j=0;j<v[2].size();j++)ans3=min(ans3,dis(v[1][i],v[2][j])); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(s[i][j]!='.')continue; int dis1=1145141919,dis2=1145141919,dis3=1145141919; for(int k=0;k<v[0].size();k++)dis1=min(dis1,dis(v[0][k],make_pair(i,j))); for(int k=0;k<v[1].size();k++)dis2=min(dis2,dis(v[1][k],make_pair(i,j))); for(int k=0;k<v[2].size();k++)dis3=min(dis3,dis(v[2][k],make_pair(i,j))); ans4=min(ans4,dis1+dis2+dis3+1); } } cout<<min(ans1+ans2,min(ans2+ans3,min(ans1+ans3,ans4))); return 0; }