Codeforces 402C Searching for Graph【构造】

本文介绍了一个算法问题,任务是构造一个包含n个顶点、2n+p条边的图,确保任意子图的边数不超过2k+p。文章通过直观观察得出解决方案,并提供了一个简单有效的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A. Searching for Graph
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Let's call an undirected graph of n vertices p-interesting, if the following conditions fulfill:

  • the graph contains exactly 2n + p edges;
  • the graph doesn't contain self-loops and multiple edges;
  • for any integer k (1 ≤ k ≤ n), any subgraph consisting of k vertices contains at most 2k + p edges.

A subgraph of a graph is some set of the graph vertices and some set of the graph edges. At that, the set of edges must meet the condition: both ends of each edge from the set must belong to the chosen set of vertices.

Your task is to find a p-interesting graph consisting of n vertices.

Input

The first line contains a single integer t (1 ≤ t ≤ 5) — the number of tests in the input. Next t lines each contains two space-separated integers: n, p (5 ≤ n ≤ 24; p ≥ 0; ) — the number of vertices in the graph and the interest value for the appropriate test.

It is guaranteed that the required graph exists.

Output

For each of the t tests print 2n + p lines containing the description of the edges of a p-interesting graph: the i-th line must contain two space-separated integers ai, bi (1 ≤ ai, bi ≤ nai ≠ bi) — two vertices, connected by an edge in the resulting graph. Consider the graph vertices numbered with integers from 1 to n.

Print the answers to the tests in the order the tests occur in the input. If there are multiple solutions, you can print any of them.

Examples
Input
1
6 0
Output
1 2
1 3
1 4
1 5
1 6
2 3
2 4
2 5
2 6
3 4
3 5
3 6

题目大意:

给你一个数n,另一个数p,让你构造一个包含n个点,2n+p条边的一个图,使得其子图无论多大(1<=k<=n),其中边的个数都小于等于2k+p;


思路:


直觉告诉我,这个题都是个逗比题,然后看样例输出,按照完全图的顺序来输出的。

那么我为何不试一试按照完全图的顺序输出一发呢?

然后就过了............

就过了..............

过了.............

了.............


Ac代码:

#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,p;
        scanf("%d%d",&n,&p);
        int x,y;
        x=1;y=2;
        for(int i=0;i<n*2+p;i++)
        {
            printf("%d %d\n",x,y);
            y++;
            if(y==n+1)
            {
                x++;
                y=x+1;
            }
        }
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值