Pinely Round 1 (Div. 1 + Div. 2) E - Make It Connected思维分类讨论

news2024/11/15 8:53:24

昨晚的problem e 一直wa。因为答案,不唯一,调起来只能肉眼debug。被干emo了qwq。好在赛后看到 ugly2333的 思路和我差不多,最后还是要选取度数较小的最优,
好像从度数的角度出发,不容易wa。

题意:

给你一个图,用矩阵表示。
问是否可以翻转一些行的状态,使得图连通。

思路:

  • 我们先利用并查集,求出所有连通块
  • 发现所有连通块之间都没有边。

case 1

连通块数为1,直接输出0即可(因为已经连通

case 2

假如有一个连通块不是完全图,那么我们可以对这个连通块中的一个点操作,之后就可以使得连通。
在这里插入图片描述
图1

我们发现有一些性质,

  • 原本 { 5 , 6 , 7 } \{5,6,7\} {5,6,7}是一个3完全图,只要对节点4操作,那么就可以和这个连通块 { 5 , 6 , 7 } \{5,6,7\} {5,6,7}连通
  • 因为原图 ( 4 , 3 ) , ( 4 , 2 ) (4,3),(4,2) (4,3),(4,2)没有边,所以我们断开 ( 4 , 1 ) (4,1) 41,不会影响 { 1 , 2 , 3 , 4 } \{1,2,3,4\} {1,2,3,4}的连通性

我们对第一个连通块的4号节点操作,那么图变为
![在这里插入图片描述](https://img-blog.csdnimg.cn/d99710cb2fec4c5285c7011509d0aa50.png
图2

是不是对 { 1 , 2 , 3 , 4 } \{1,2,3,4\} {1,2,3,4}中的任何一个点操作都可以?
不是!!!!!对于图1中的1号节点操作
那么图变为
在这里插入图片描述
发现图1度数最小的4号节点变的不连通!!!!!!
结论:如果存在不是完全图,的连通块,那么我们选择度数最小的点

case3

所有连通块都是完全图,
假如只有两个连通块。
在这里插入图片描述
图4
{ 1 , 2 , 3 , 4 } \{1,2,3,4\} {1,2,3,4} { 5 , 6 , 7 } \{5,6,7\} {5,6,7}怎么连通?
对于节点4操作,告诉了我们一个性质:

  • 4会和 { 5 , 6 , 7 } \{5,6,7\} {5,6,7}构成一个 4完全图
  • 4会和 { 1 , 3 , 2 } \{1,3,2\} {1,3,2}失去连通性,
  • 那么问题就转换为了新的 { 1 , 2 , 3 } \{1,2,3\} {1,2,3} { 5 , 6 , 7 , 4 } \{5,6,7,4\} {5,6,7,4}怎么连通。
    结论:如果存在两个完全图,的连通块,那么我们贪心选择点数最少的连通块

case4

所有连通块都是完全图,
假如有超过两个连通块。
在这里插入图片描述
我们还是对4号节点操作
在这里插入图片描述
这里和case3的时候有点不同。

  • { 1 , 2 , 3 , 4 } \{1,2,3,4\} {1,2,3,4}4完全图 { 4 , 7 , 8 , 9 } \{4,7,8,9\} {4,7,8,9}4完全图
  • { 1 , 2 , 3 , 4 , 7 , 8 , 9 } \{1,2,3,4,7,8,9\} {1,2,3,4,7,8,9}不是7完全图
  • 这个问题就变成了case2

总结:

  • case1 连通块数为1,直接输出0
  • case2 所有连通块中,有不是完全图的,那么我们操作连通块中最小度数的节点输出。
  • case3 所有连通块都是完全图,且只有两个连通块,我们操作较小的那个连通块内的所有节点。
  • case4 所有连通块都是完全图,且有2个以上的连通块,我们先操作任意一个连通块的一个点,转换为case2

C++

#include <iostream>
#include <cstdio>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <algorithm>
#include <queue>
#include <stack>
#include <string>
#include <cmath>
#include <cstring>
#define For(i,x,y) for(int i = (x); i <= (y); i ++ )
#define fori(i,x,y) for(int i = (x); i < (y); i ++ )
#define sz(a) (int)a.size()
#define ALL(a) a.begin(), a.end()
#define mst(x,a) memset(x,a,sizeof(x))
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define fi first
#define se second
#define db double
#define endl '\n' 
#define debug(a) cout << #a << ": " << a << endl
using namespace std;
typedef long long LL;
typedef long long ll;
typedef unsigned long long ULL;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
typedef pair<int,int>pa;
typedef pair<ll,ll>pai;
typedef pair<db,db> pdd;
const db eps = 1e-6;
const db pi = acos(-1.0);

template<typename T1, typename T2> void ckmin(T1 &a, T2 b) { if (a > b) a = b; }
template<typename T1, typename T2> void ckmax(T1 &a, T2 b) { if (a < b) a = b; }
int read() {
    int x = 0, f = 0; char ch = getchar();
    while (!isdigit(ch)) f |= ch == '-', ch = getchar();
    while (isdigit(ch)) x = 10 * x + ch - '0', ch = getchar();
    return f ? -x : x;
}
template<typename T> void print(T x) {
    if (x < 0) putchar('-'), x = -x;
    if (x >= 10) print(x / 10);
    putchar(x % 10 + '0');
}
template<typename T> void print(T x, char let) {
    print(x), putchar(let);
}
template<class T> bool uin(T &a, T b) { return a > b ? (a = b, true) : false; }
template<class T> bool uax(T &a, T b) { return a < b ? (a = b, true) : false; }

const int maxn = 4000 + 5;

int g[maxn][maxn];
int p[maxn];
int find(int x){
    if(x == p[x]) return x;
    return p[x] = find(p[x]);
}
int n; 
void merge(int a, int b){
    int fa = find(a), fb = find(b);
    if(fa == fb) return ;
    p[fa] = fb;
}

vector<int> color[maxn];
void init(){
    cin >> n;
    
    for(int i = 1; i <= n; i ++ ) p[i] = i;
    for(int i = 1; i <= n; i ++ ) {
        string s; cin>>s;
        s = " " + s;
        for(int j = 1; j <= n; j ++ ) {
            if(s[j] == '1'){
                g[i][j] = 1;
                int a = i, b = j;
                merge(a,b);
            }else g[i][j] = 0;
        }
    }
    for(int i = 1; i <= n; i ++ ) color[i].clear();
}
void sol(){
    init();
    for(int i = 1; i <= n; i ++ ) color[find(i)].pb(i);
    //check all graph
    vector<pair<int,int>> allG;
    int ansp = -1;
    for(int col = 1; col <= n; col ++ ) {
        if(col != find(col)) continue;
        //col == find(col)
        auto& v = color[col];
        int cnt = 0;
        for(int i = 0; i < v.size(); i ++ ) {
            for(int j = 0; j < v.size(); j ++ ) {
                if(i == j) continue;
                cnt += (g[v[i]][v[j]]);
                if(g[v[i]][v[j]] == 0) ansp = v[i];
            }
        }
        int tot = v.size();
        
        //connect
        if(tot == n){
            cout << 0 << endl;
            return ;
        }
        // if(cnt == tot*(tot-1)/2)
        if(cnt == tot*(tot-1)){
            allG.pb({tot,col});
            // debug(tot);
            // debug(col);
        }
    }
    int ans;
    if(ansp == -1){
        //mi > 2
        //all is graph
        sort(ALL(allG));
        int col = allG.front().second;
        auto& v = color[col];
        if(allG.size() == 2 || v.size() == 1){
            ans = allG.front().first;
            cout << ans << endl;
            int begin = 0;
            for(int x: v) {
                if(begin) cout << ' ';
                cout << x;
                begin = 1;

            }
            cout << endl;
        }else {
            cout << 2 << endl;
            cout << v.front() << ' ' << color[allG[1].second].front()<<endl;
        }
    }else {
        //wa on this 
            /* cout << 1 << endl;
            cout <<ansp<<endl; */

        cout << 1 << endl;
        //init
        for(int i = 1; i <= n; i ++ ) p[i] = i;
        for(int i = 1; i <= n; i ++) for(int j = 1; j <= n; j ++ ) {
            if(i == ansp || j == ansp) continue;
            if(g[i][j])p[find(i)] = find(j);
        }
        //reverse
        for(int j = 1; j <= n; j ++ ) if(g[ansp][j] == 0) p[find(ansp)] = find(j);
        int occ = 0;
        for(int i = 1; i <= n; i ++ ) occ += (find(i) == i);
        if(occ == 1){
            cout <<ansp<<endl;
            return ;
        }
        for(int i = 1; i <= n; i ++) if(find(i) != find(ansp)){
            ansp = i;
            break;
        }
        cout << ansp<<endl;
    }
}


int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int tt; cin>>tt;
    while(tt--)
        sol();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是组织孤岛?它会带来哪些影响?可以这样去对付它

作为一个在不同地点和时区与不同团队合作的远程工作者&#xff0c;我有过公平的孤岛经历。 是的&#xff0c;它们扼杀了任何组织的成长。那么&#xff0c;在使你&#xff08;和组织中的每个人&#xff09;失去生产力、困惑、自私和不快乐之后。 在这篇文章中&#xff0c;我将…

ADRV9009中armBinary反汇编IDA参数设置

armBinary.bin文件如果不做处理的话就是一堆16进制数,扔到IDA里也只是一堆有颜色的16进制数,需要进行一些参数设置。 1 选择IDA32位打开armBinary.bin文件 2 load a new file设置 Processor type选择ARM Little-endian [ARM],点击Edit ARM architecture options进行相应修…

Linux 中的内部命令和外部命令

Linux 中的内部命令和外部命令 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;Linux 中的内部命令和外部命令 CSDN&#xff1a;Linux 中的内部命令和外部命令 什么是 bash shell ? bash shell&#xff0c;就是一个程序&#xff0c;就是 Linux 系统安装的…

漫谈 Java 平台上的反应式编程

反应式编程&#xff08;Reactive Programming&#xff09;是一套完整的编程体系&#xff0c;既有其指导思想&#xff0c;又有相应的框架和库的支持&#xff0c;并且在生产环境中有大量实际的应用。在支持度方面&#xff0c;既有大公司参与实践&#xff0c;也有强大的开源社区的…

【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍

目录 一、yum 1.了解yum &#xff08;1&#xff09;RPM &#xff08;2&#xff09;yum 2.yum使用 &#xff08;1&#xff09;查看软件包 &#xff08;2&#xff09;安装软件 &#xff08;3&#xff09;卸载软件 二.Linux编辑器-vim 1. vim概念 &#xff08;1&am…

flink集群搭建

1、安装包flink-1.10.0-bin-scala_2.11.tgz 2、tar -zxf flink-1.10.0-bin-scala_2.11.tgz 解压到指定目录 解压之后的文件名称是flink-1.10.0 3、flink-1.10.0的目录结构如下&#xff1a; bin/&#xff1a;flink的相关命令 conf/&#xff1a;flink的配置文件 examples/&a…

业务数据分析-Excel公式与函数(三)

目录 概念 运算符 地址的引用 逻辑函数 文本函数 统计函数 查找与引用函数 日期函数 常见出错信息 概念 公式&#xff1a;Excel的核心功能&#xff0c;功能强大 如果要定义的话&#xff0c;可以说是 以开头的&#xff0c;对地址进行引用的计算形式 说的高大上一点的…

方法2—并行数据流转换为一种特殊串行数据流模块的设计

并行数据流转换为一种特殊串行数据流模块的设计&#xff0c;设计两个可综合的电路模块1&#xff0c;第一个可综合模块&#xff0c;M1。2&#xff0c;描述M2模块3&#xff0c;描述M0模块的Verilog代码4&#xff0c;描述顶层模块5&#xff0c;电路生成的门级网表&#xff0c;netl…

Camtasia2023简单易用的电脑录屏视频剪辑软件

教学、演示、培训视频轻松制作!Camtasia非常容易学习 你不需要一个大的预算或花哨的视频编辑技能。只需录制屏幕并添加一些特效即可。无论您是有经验还是这是第一次制作视频 Camtasia都会为您提供制作高质量视频所需的一切。创建观看者实际观看的内容。视频将为您提供更多的互动…

军队文职丨2022年武警部队面向社会公开招聘351名文职人员公告!高中学历可报,11月25日前报名!

2022年武警部队面向社会公开招聘 专业技能岗位文职人员公告 根据《军队专业技能岗位文职人员聘用管理暂行规定》及有关政策规定&#xff0c;现就2022年武警部队面向社会公开招聘专业技能岗位文职人员有关事项公告如下&#xff1a; 一、招聘岗位 武警部队所属用人单位运输投送…

前后端分类 (增加,查询)

目录 一&#xff0c;后台代码 二&#xff0c;前台代码 一&#xff0c;后台代码 一&#xff0c;配置文件 application.yml server:port: 8080servlet:context-path: /spboot spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.j…

隧道HTTP API使用教程

华科隧道HTTP格式为&#xff1a;ip:port username password 隧道代理分钟2种模式&#xff1a; 固定时间更改新IP&#xff08;比如5分钟&#xff0c;10分钟&#xff0c;初次开通的时候可设定&#xff09;请求一次更换一个新IP&#xff08;可通过浏览器或者curl&#xff09; 1、…

图_图的存储_添加边_图的遍历_DFS_树的重心_BFS_图中点的层次

文章目录图有向图的存储添加遍历1.DFS例题&#xff1a;树的重心题目分析使用DFS遍历2.BFS例题&#xff1a;图中点的层次图 树是特殊的图&#xff08;无环连通图&#xff09; 有向图&#xff08;a -> b&#xff09; 无向图&#xff08;a -> b, b -> a&#xff09; …

ffmpeg源码阅读之avformat_alloc_output_context2

整体结构流程 核心逻辑 通过读源码发现核心的处理逻辑是av_guess_format函数&#xff0c;这里就根据核心逻辑来阅读&#xff0c;其余的基本是是在做判断和赋值 av_guess_format阅读分析 步骤1(先看头文件) /*** Return the output format in the list of registered output…

wy的leetcode刷题记录_Day46

wy的leetcode刷题记录_Day46 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2022-11-19 前言 补 目录wy的leetcode刷题记录_Day46声明前言1732. 找到最高海拔题目介绍思路代码收获106. 从中序与后序遍历序列构造二叉树题目介绍思路代码…

【Java毕设】基于SpringBoot实现新冠疫情统计系统(Idea+Navicat)

推荐学习专栏&#xff1a; Java基础学习专栏&#xff1a;java基础知识学习Java进阶学习专栏&#xff1a;java编程进阶学习 前言 疫情在我们的生活中反反复复&#xff0c;为了方便我们更直观的清楚新冠疫情数据&#xff0c;通过Java编程可以统计疫情信息&#xff0c;更好管控。…

CSC公派|在读博士赴新加坡南洋理工大学联合培养

我们先助O同学取得了英国牛津大学的邀请函&#xff0c;并成功获批CSC项目。由于该校办理T5签证所需的COS担保证书迟迟未果&#xff0c;考虑到其毕业及CSC延期时限&#xff0c;我们又为O同学申请到新加坡南洋理工大学&#xff0c;顺利改派并签证出国。 O同学背景&#xff1a; 申…

【数据库09】数据库系统体系结构

前 言 &#x1f349; 作者简介&#xff1a;半旧518&#xff0c;长跑型选手&#xff0c;立志坚持写10年博客&#xff0c;专注于java后端 ☕专栏简介&#xff1a;相当硬核&#xff0c;黑皮书《数据库系统概念》读书笔记&#xff0c;讲解&#xff1a; 1.数据库系统的基本概念(数据…

WPF之MVVM模式

1.MVVM模式 MVVM即模型-视图-视图模型 &#xff0c;是用于解耦 UI 代码和非 UI 代码的 设计模式。 借助 MVVM&#xff0c;可以在 XAML 中以声明方式定义 UI&#xff0c;将 UI使用数据绑定标到包含数据和命令的其他层。 数据绑定提供数据和结构的松散耦合&#xff0c;使 UI 和链…

内联函数详解

文章目录前言正文知识点一&#xff1a;内联1、内联函数的诞生2、内联函数概念3、内联函数的特性结语前言 这里vince将要进入C的学习了&#xff0c;C学习将是一个漫长的过程&#xff0c;当然在学习这里的基础上前面的知识也不能不复习。也有很多人说C有多难有多难的&#xff0c…