分析
首先明确图的定义,图=点集+边集,其中点必须要有一个,图不可以是空图。(虽然和这道题没关系)
正着想不明白那就反着来(正难则反)。
假设目前所有边都是连上的,可以发现每个点的邻边和如下(假设有4个点):
1:(1)+2+3+4
2:1+(2)+3+4
3:1+2+(3)+4
4:1+2+3+(4)
如果这些括号的值全部加上那就满足条件了,但是现在每个点的和都不一样。
发现点1和点4,点2和点3对着减掉之后就满足条件了,猜测满足条件如下:
断掉边(1,n)(2,n-1)(3,n-2)....则每个点的邻边和都为所有点之和-(n+1),满足条件。
但是发现奇数点个数情况不适应。
断掉边(1,n-1)(2,n-2)....则每个点的邻边和都为所有点之和-n,最后一个点不额外断边,满足条件。
AC代码
#include <bits/stdc++.h>
//#define int long long
#define fr first
#define se second
#define endl '\n'
using namespace std;
int n,l,r,cnt;
bool e[101][101];
vector<pair<int,int>>ans;
void solve(){
for(int i=1;i<=100;++i)
for(int j=1;j<=100;++j)
if(i!=j)e[i][j]=true;
cin>>n;
l=1,r=(n&1)==1?n-1:n;
while(l<r)e[l++][r--]=false;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(e[i][j] and e[j][i])ans.push_back({i,j}),e[i][j]=false,cnt++;
cout<<cnt<<endl;
for(auto i:ans)cout<<i.fr<<" "<<i.se<<endl;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr);
int t=1;
while(t--)solve();
return 0;
}