当前位置:网站首页>2022.8.8考试区域链接(district)题解
2022.8.8考试区域链接(district)题解
2022-08-10 01:55:00 【bj_hacker】
题目
4、区域链接(district)–1200
时间限制: | 空间限制:
题目描述:
有 个点,第 个点的颜色为 。
你要添加 条双向边使所有点连通。一条边的两个端点颜色不能相同。
给出任意一种符合条件的构造方案,或者判断不存在符合条件的方案。共 组数据。
输入格式:
第一行仅有一个正整数 ( ),表示测试数据的组数。
每组测试数据包括两行:
第一行一个正整数 ( ,所有数据中 之和不超过 ),表示点的个数;
第二行 个正整数 ( ),表示每个点的颜色。
输出格式:
对于每组测试数据,若不存在符合条件的方案输出 ;
否则,第一行输出 ,接下来的 行输出你的构造方案中每条边的端点。
思路
将n个点能连出去的所有合法未访问过的点记录将剩下的点继续遍历
重点
时间复杂度仅支持O(n^2),合理控制
代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e3+10;
int t,n;
int a[maxn];
int mp[maxn][2];
bool vis[maxn];
inline bool Prim(){
memset(vis,false,sizeof(vis));
memset(mp,0,sizeof(mp));
vis[1]=true;
int cnt=0;
for(int i=1;i<=n;i++){
if(!vis[i])continue;
for(int j=1;j<=n;j++){
if(vis[j])continue;
if(a[i]==a[j])continue;
mp[++cnt][0]=i;
mp[cnt][1]=j;
vis[j]=true;
}
}
bool flag=true;
for(int i=1;i<=n;i++){
if(!vis[i]){
flag=false;
break;
}
}
if(flag)return true;
return false;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
if(Prim()){
printf("YES\n");
for(int i=1;i<=n-1;i++)printf("%d %d\n",mp[i][0],mp[i][1]);
}
else printf("NO\n");
}
return 0;
}
边栏推荐
猜你喜欢
随机推荐
【二叉树-简单】112. 路径总和
Process management and task management
【UNR #6 C】稳健型选手(分治)(主席树)(二分)
【二叉树-中等】1261. 在受污染的二叉树中查找元素
In the 2022 gold, nine, silver and ten work tide, how can I successfully change jobs and get a high salary?
Initial attempt at UI traversal
openpose脚部标注问题梳理
自动化测试中,测试数据与脚本分离以及参数化方法
2022杭电多校联赛第七场 题解
翻译软件免费版下载-免费版翻译软件下载
3dmax如何制作模型走路动画
OpenCV图像处理学习二,图像掩膜处理
【二叉树-中等】687. 最长同值路径
具有多孔光纤的偏振分束器
力扣每日一题-第51天-744. 寻找比目标字母大的最小字母
控制台中查看莫格命令的详细信息
牛客刷题——剑指offer(第四期)
使用IDEA的PUSH常见问题
RESOURCE_EXHAUSTED: etcdserver: mvcc: database space exceeded
Go语言JSON文件的读写操作





![[Turn] Typora_Markdown_ picture title (caption)](/img/67/589eed8de86bff9fc017ae7c409410.png)


