题意
给定一个整数 $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; }