题解:
首先n为偶数时候,先拆掉桥,那么其中一个分量的度为奇数,但是加入每条边度都会增加偶数,所以不可能。
对于奇数先把1判掉 然后可以弄出来一个对称图 对于其中一个连通图 加入两个点 将这两个点连接起来
加入一个点为割点 所以现在3个点的度都为1 再加入k-1个点 每个点连接这3个点 这3个点的度就完成了
现在解决k-1个点 每个点的度增加k-3 对于奇数跳过 对于偶数连过去
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int k;
scanf("%d",&k);
if(k==1){
printf("YES\n2 1\n1 2\n");
return 0;
}
if(!(k%2)){
printf("NO\n");
}
else{
printf("YES\n");
int i,n=k+2;
printf("%d %d\n",n*2,n*k);
printf("%d %d\n",n-1,n-2);
printf("%d %d\n",2*n-1,2*n-2);
for(i=1;i<k;i++){
printf("%d %d\n",i,n-1);
printf("%d %d\n",i,n-2);
printf("%d %d\n",i,n);
printf("%d %d\n",i+n,2*n-1);
printf("%d %d\n",i+n,2*n-2);
printf("%d %d\n",i+n,2*n);
}
for(i=1;i<k;i++){
int j;
if(i%2)j=i+2;
else j=i+1;
for(;j<k;j++){
printf("%d %d\n",i,j);
printf("%d %d\n",i+n,j+n);
}
}
printf("%d %d\n",n,n+n);
}
return 0;
}