题目大意:给定n和p,我们需要构造一张点数为n,边数为2n+p的简单无向图,满足任意一个点数为k的子图的边数不超过2k+p
逗B题……
我们只需要把字典序最小的2n+p条边输出就行了
下面我们来证明这么做是对的
首先这个条件等价于【删掉任意k个点,都有至少2k条边被跟着删掉】
然后我们来看这样一个图:
显然这个图是我们构造的图的子图
下面我们来证明这个性质
假如我们删掉了k个点,那么:
如果删掉的k个点都是中间那一列的,由于一个点对应至少两条边,那么我们一定至少删掉了2k条边;
否则:
如果我们在中间的列删掉了不超过n?4个点,那么两侧的点每个点还对应着至少两条边;
如果我们在中间的列删掉了至少n?3个点,那么如果我们在两侧再删去至少1个点,整个图将会剩下不超过2个点
点数不超过2的子图一定满足条件
证毕
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,p;
void Solve()
{
int i,j,cnt=0;
cin>>n>>p;m=n+n+p;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
printf("%d %d\n",i,j);
if(++cnt==m)
return ;
}
}
int main()
{
int T;
for(cin>>T;T;T--)
Solve();
return 0;
}
时间: 2024-12-19 03:36:14