题解:B4164 [BCSP-X 2024 12 月初中组] 末日塔后传
题目传送门
题目大意
有
思路
这题只给一个
首先,因为我是蒟蒻,所以第一时间想到了暴力:枚举所有竞赛图找直径
于是我又考虑到随机化:随机定向的竞赛图在
于是最终因为我想到了一个绝妙的方法(我看到了题目标签),就是构造:手推一个通用方案,
所以用构造。不妨把塔看成点、管道看成有向边,题目就是要构造一个直径不超过
当
当
当
于是继续推,发现剩下的
当
当
-
- 奇数点
v 到n :v\to v+1\to n ,2 步; - 偶数点直接连
n 、n 直接连奇数点,都是1 步; - 前
n-1 个点内部还是直径2 。 所以整体直径是2 ,且每对点恰好一条边,仍然是合法竞赛图。
所有情况下复杂度
参考代码
:::success[AC CODE]
#include<bits/stdc++.h>
using namespace std;
int n;
int a[505][505]; // 邻接矩阵
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
if(n==2||n==4){
cout<<"NO";
return 0;
}
cout<<"YES"<<endl;
if(n%2==1){
for(int i=1;i<=n;i++){
for(int k=1;k<=n/2;k++){ // 循环竞赛图: i 向 i+1..i+(n-1)/2
a[i][(i-1+k)%n+1]=1;
}
}
}
else{
int m=n-1;
for(int i=1;i<=m;i++){ // 前 n-1 个点建循环竞赛图
for(int k=1;k<=m/2;k++){
a[i][(i-1+k)%m+1]=1;
}
}
for(int i=1;i<=m;i++){ // 第 n 个点: 奇数点 <- n, 偶数点 -> n
if(i%2==1){
a[n][i]=1;
}
else{
a[i][n]=1;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl; //换行是个好习惯
}
return 0;
}
:::
:::info[AI 使用说明] 本文使用 DeepSeek 进行了润色。 :::