首页 > 编程语言 >AcWing算法周赛第6场 | 3735 构造完全图

AcWing算法周赛第6场 | 3735 构造完全图

时间:2025-01-14 10:58:22浏览次数:3  
标签:周赛 cout 输出 int 第二行 操作 3735 AcWing

学习C++从娃娃抓起!记录下AcWing备赛学习过程中的题目,记录每一个瞬间。

附上汇总贴:AcWing算法周赛 |汇总


【题目描述】

给定一个由 n n n 个点和 m m m 条边构成的无向连通图。

我们希望通过一系列操作将其变为一个完全图(即每对不同的顶点之间都恰有一条边相连)。

每次操作时,可以选择其中一个点,找到所有和它直接相连的点,使这些点两两之间连边(若两点之间已经存在边,则无需重复连接)。

请问,至少多少次操作以后,可以将整个图变为一个完全图?

【输入】

第一行包含两个整数 n , m n,m n,m。

接下来 m m m 行,每行包含两个整数 u , v u,v u,v,表示点 u u u 和点 v v v 之间存在一条边。

所有点编号 1 ∼ n 1\sim n 1∼n。

【输出】

第一行输出最少操作次数。

第二行输出每次操作所选的点的编号,整数之间空格隔开。如果最少操作次数为 0 0 0,则无需输出第二行。

如果答案不唯一,则输出任意合理方案均可。

【输入样例】

5 6
1 2
1 3
2 3
2 5
3 4
4 5

【输出样例】

2
2 3

【分析】

在这里插入图片描述

【代码详解】

《Acwing 3735 构造完全图》 #贪心# #状态压缩DP#

#include <bits/stdc++.h>
using namespace std;
const int N = 22, M = 1<<N;
typedef pair<int, int> PII;
int n, m;
int e[N];
int f[M];
PII g[M];
int main()
{
    cin >> n >> m;
    if (m == n * (n-1)/2)
    {
        cout << 0 << endl;
        return 0;
    }
    for (int i=0; i<n; i++) e[i] = 1 << i;
    while (m--)
    {
        int a, b;
        cin >> a >> b;
        a--, b--;
        e[a] |= 1<<b;
        e[b] |= 1<<a;
    }
    memset(f, 0x3f, sizeof(f));
    for (int i=0; i<n; i++)
    {
        f[e[i]] = 1;
        g[e[i]] = {0, i};
    }
    for (int i=0; i< 1<<n; i++)
    {
        if (f[i] == 0x3f3f3f3f) continue;
        for (int j=0; j<n; j++)
        {
            if (i>>j & 1)
            {
                int k = i | e[j];
                if (f[k]>f[i]+1)
                {
                    f[k] = f[i] + 1;
                    g[k] = {i, j};
                }
            }
        }
    }
    int k = (1<<n) - 1;
    cout << f[k] << endl;
    while (k)
    {
        cout << g[k].second + 1 << " ";
        k = g[k].first;
    }
    return 0;
}

【运行结果】

5 6
1 2
1 3
2 3
2 5
3 4
4 5
2
2 3

标签:周赛,cout,输出,int,第二行,操作,3735,AcWing
From: https://blog.csdn.net/guolianggsta/article/details/145133726

相关文章

  • AcWing算法周赛第6场 | 3734 求和
    学习C++从娃娃抓起!记录下AcWing备赛学习过程中的题目,记录每一个瞬间。附上汇总贴:AcWing算法周赛|汇总【题目描述】用f(x)......
  • leetcode周赛432 T4(单调栈 + 单调队列)
    一道练习单调栈+单调队列的好题题目链接:problem对于求合法子数组数量的题目,可以先考虑传统的枚举右端点,二分左端点的套路。此题用这种方法恰好可行,因为对于一个序列,左端增加一个数不会让操作数更少。因此对于固定右端点,合法的左端点一定是一段区间。所以现在问题转化为:用双指......
  • 【牛客训练记录】牛客周赛 Round 76
    训练情况赛后反思D题被卡常了,我知道是优先队列的问题,但是一直有一个点过不去,E题疑似二分,但是我不会处理快速幂溢出的问题A题工作日每天\(3\)题,求\(x\)天一共有几周,一周有五个工作日,剩下不足\(7\)天的分类讨论。#include<bits/stdc++.h>//#defineintlonglong#de......
  • AcWing算法基础课打卡 | 790 数的三次方根
    学习C++从娃娃抓起!记录下AcWing刷过的题目,记录每一个瞬间。附上汇总贴:AcWing算法基础课打卡|汇总【题目描述】给定一个浮点数,求它的三次方根。【输入】共一行,包含一个浮点数。【输出】共一行,包含一个浮点数,表示问题的解。注意,结果保留位小数。【输入样例】1......
  • AcWing算法基础课打卡 | 788 逆序对的数量
    学习C++从娃娃抓起!记录下AcWing刷过的题目,记录每一个瞬间。附上汇总贴:AcWing算法基础课打卡|汇总788逆序对的数量【题目描述】给定一个长度为nnn的整数数列,请你......
  • AcWing算法基础课打卡 | 789 数的范围
    学习C++从娃娃抓起!记录下AcWing刷过的题目,记录每一个瞬间。附上汇总贴:AcWing算法基础课打卡|汇总789数的范围【题目描述】给定一个按照升序排列的长度为nnn的整......
  • 蓝桥周赛差分问题
    题目如下 暴力不可取,学会差分然后前缀和,大家注意k的取值范围,要对26取余数,因为26为一个循环,我们只需要它的余数就可以了,我的差分数组减1操作,是因为我的下标是0开始的,如果从1开始,就不用减一,然后r的话就是diff[r+1]-=k,这样来写。  记住记住:一定要取26的余数!!!注意下标的选取......
  • AcWing 799:最长连续不重复子序列 ← 双指针
    【题目来源】https://www.acwing.com/problem/content/801/【题目描述】给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。【输入格式】第一行包含整数n。第二行包含n个整数(均在0∼10^5范围内),表示整数序列。【输出格式】共一行,包含一个......
  • AcWing 791:高精度加法 ← string+数组
    【题目来源】https://www.luogu.com.cn/problem/P1601https://www.acwing.com/problem/content/793/【题目描述】高精度加法,相当于a+bproblem,不用考虑负数。输入不含前导0。【输入格式】分两行输入。a,b≤10^500。【输出格式】输出只有一行,代表a+b的值。【输入样例】1......
  • 牛客周赛 Round 72
    怎么全是01串A枚举除了末尾的字符,判断下一个是否与它不同,不同则对答案的贡献++B找一个连续子串是好串,如果我们找到长度为len的子串,那么从中任意截取一段均为好串长度为len的子串1个长度为len-1的子串2个.....长度为2的子串len-1个用等差数列公式一个长度为len的好串......