连通块构造
M-Matrix Problem_第十一届山东省大学生程序设计竞赛(正式赛)
理论上写的第二个构造题,我原来想的是把1固定住,然后把a变连通,然后反过来的1变成0固定住,然后把b变连通
变连通就是把分散开来的连通块合并到一起
hhh
想法很单纯,我纠结了好久不知道怎么变连通
这个就是连通块的构造题了,这种矩阵,可以首先想到的是它的奇偶性,按照奇偶性来构造
把a的偶数行变为1,b的奇数行变为1,然后相交错开,可以保证了原来的矩阵都是0,(固定的1除外,这个当然ab的那个位置都是1)
然后可以极大程度上的保证了矩阵的连通,因为错开的是连通的,假设错开的中间这一行有一个原本的1,那必然变连通
那如果没有怎么办,就用到四周的0了,创造出来一个1,这时候可以把a的左边界变成1,那a就连通了,b同理,如果有一行空出来,那右边的边界是1
题目蛮好的
但是读完题目是可以一次性看出来做法的,还是我做题太少,见的太少
#include<iostream> using namespace std; const int N=1010; char ch[N][N]; int a[N][N],b[N][N]; int main(){ int n,m; cin>>n>>m; for(int i=0;i<n;i++) cin>>ch[i]; for(int i=0;i<n-1;i++) { if(i%2==0)//a偶行都是0,b偶行都是1 { for(int j=1;j<m-1;j++) { int x=ch[i][j]-'0'; if(x) a[i][j]=1,b[i][j]=1; else { a[i][j]=0; b[i][j]=1; } } } else if(i%2==1) { for(int j=1;j<m-1;j++) { int x=ch[i][j]-'0'; if(x) a[i][j]=1,b[i][j]=1; else { a[i][j]=1; b[i][j]=0; } } } } for(int i=0;i<n;i++) a[i][0]=1,b[i][m-1]=1; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) cout<<a[i][j]; cout<<endl; } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) cout<<b[i][j]; cout<<endl; } return 0; } /* 构造: 分奇偶,可以保证c的相应位置是0,1就固定1 然后如果有大于等于一行不连通,就改变左右两边 */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具