codeforces #402C Searching for Graph 构造

题目大意:给定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

codeforces #402C Searching for Graph 构造的相关文章

构造图 Codeforces Round #236 (Div. 2) C. Searching for Graph

题目地址 1 /* 2 题意:要你构造一个有2n+p条边的图,使得,每一个含k个结点子图中,最多有2*k+p条边 3 水得可以啊,每个点向另外的点连通,只要不和自己连,不重边就可以,正好2*n+p就结束:) 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <cstring> 9 #include <string> 10 #includ

Codeforces 429B Working out bfs构造

题目链接:点击打开链接 题意:给定n*m的矩阵 有一个人a从左上角走到右下角,只能↓或→走 另一个人b从左下角走到右上角,只能↑或→走 使得2个人的路径有且仅有一个格子是相交的. 统计2个人的权值和(相交格子的权值和不计) 问最大的权值和是多少. 思路: 首先转换一下题意,也就是找一个格子与4个角落连不相交的线. 我们观察相交的那个格子,那个格子的上下左右必然对应着一个角落. (i,j)点,那么(i-1,j)必然对应左上角或右上角的其中一个角落. 这样(i,j)点的4个相邻格子各自对应一个角落(

Codeforces 346C Number Transformation II 构造

题目链接:点击打开链接 = = 990+ms卡过 #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<vector> #include<set> using namespace std; #define N 100010 #define L(x) (x<<1) #define R(x) (x<<

Codeforces 459E Pashmak and Graph(dp+贪心)

题目链接:Codeforces 459E Pashmak and Graph 题目大意:给定一张有向图,每条边有它的权值,要求选定一条路线,保证所经过的边权值严格递增,输出最长路径. 解题思路:将边按照权值排序,每次将相同权值的边同时加入,维护每个点作为终止点的最大长度即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 3

【题解】CF739D Recover a functional graph(构造+二分图匹配)

[题解]CF739D Recover a functional graph(构造+二分图匹配) 题目大意 一个图被称为F图当且仅当每个点出度为1.可以发现这个图是一个内向基环森林,给出所有点到它能到达的环(只会有一个)的距离dis和那个环的长度len,然而有些点的信息模糊了,用?代替,可以是任何数.现在你要输出一个合法的构造方案. 可以提炼出一个图是F图的条件: 对应环的距离数组是自然数数列 \(len=k\)的点的个数是\(tk,t\in N^+\) 由于第二个条件只能用问号补,没有决策需要做

CodeForces 404C Restore Graph (构造)

题意:让人构造一个图,满足每个结点边的数目不超过 k,然后给出每个结点到某个结点的最短距离. 析:很容易看出来如果可能的话,树是一定满足条件的,只要从头开始构造这棵树就好,中途超了int...找了好久. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include

Codeforces 715B. Complete The Graph 最短路,Dijkstra,构造

原文链接https://www.cnblogs.com/zhouzhendong/p/CF715B.html 题解 接下来说的“边”都指代“边权未知的边”. 将所有边都设为 L+1,如果dis(S,T) < L ,那么必然无解. 将所有边都设为 1 ,如果 dis(S,T) > L ,那么必然无解. 考虑将任意一条边的权值+1,则 dis(S,T) 会 +0 或者 +1 . 如果将所有边按照某一个顺序不断+1,直到所有边的权值都是L+1了,那么在这个过程中,dis(S,T) 是递增的,而且一定

Codeforces 464A No to Palindromes!(构造)

题目链接:Codeforces 464A No to Palindromes! 题目大意:给定n和m,以及一个字符串s,s不存在长度大于2的回文子串,现在要求输出一个字典比s大的字符串,并 且说同样不存在长度大于2的回文子串. 解题思路:直接去构造即可,从最后一位开始,每次只要考虑该字符是否和前两个字符相同即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std;

codeforces 622. Optimal Number Permutation 构造

题目链接 假设始终可以找到一种状态使得值为0, 那么两个1之间需要隔n-2个数, 两个2之间需要隔n-3个数, 两个3之间隔n-4个数. 我们发现两个三可以放到两个1之间, 同理两个5放到两个3之间....这样就构造好了. #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmat