• AtCoder Grand Contest 032 B


    题意

    B - Balanced Neighbors

    给定一个整数 $N$($3leq N leq 100$),构造一个顶点编号为 $1...N$ 的无向图,需满足如下两个条件:

    • 简单图且连通
    • 存在一个整数 $S$,使得对于每个顶点,与其相连的顶点的编号和都为 $S$

    可以证明至少有一个满足上述条件的图,请输出这样的图。

    分析

    手动尝试一下 $n=3,4,5$,可以找到一个构造方法。

    考虑完全 $k$ 分图(类比完全二分图),并保证这 $k$ 部分的和都相等。

    如果 $n$ 为偶数,那么我们可以两联配对,即 ${1,n },  {2,n-1 },..., { n/2, n/2+1}$.

    如果 $n$ 为奇数,那么我们把 $n$ 单独拿出来作为一组,剩余的 $n-1$ 个两两配对。

    这样构造的图在 $n geq 3$ 时连通性易证。

    #include<bits/stdc++.h>
    using namespace std;
    
    int n;
    int a[55][2];
    
    void solve()
    {
        if(n&1) n = n-1;         //奇数化成偶数
        for(int i = 1;i <= n/2;i++)
        {
            a[i][0] = i;
            a[i][1] = n+1-i;
        }
        for(int i = 1;i <= n/2;i++)
            for(int j = 0;j < 2;j++)
                for(int k = i+1;k <= n/2;k++)
                    for(int t = 0;t < 2;t++)
                        printf("%d %d
    ", a[i][j], a[k][t]);
    }
    
    int main()
    {
        scanf("%d", &n);
        int m = 2 * (n/2) * (n/2 - 1);
        if(n & 1)
        {
            printf("%d
    ", m + n - 1);
            for(int i = 1;i < n;i++)  printf("%d %d
    ", n, i);
            solve();
        }
        else
        {
            printf("%d
    ", m);
            solve();
        }
        return 0;
    }

    参考链接:https://oi-wiki.org/basic/construction/

  • 相关阅读:
    软件工程(2018)第一次作业
    SQA计划
    再冲刺
    第三次冲刺
    第二次冲刺
    小组第一次冲刺
    团队合作初体验
    关于git的认识与想法
    我的第一篇博客
    SQA计划和系统测试规程
  • 原文地址:https://www.cnblogs.com/lfri/p/11338223.html
Copyright © 2020-2023  润新知