codeforces #550D Regular Bridge 构造

题目大意:给定k(1≤k≤100),要求构造一张简单无向连通图,使得存在一个桥,且每一个点的度数都为k

k为偶数时无解

证明:

将这个图缩边双,能够得到一棵树

那么一定存在一个叶节点,仅仅连接一条桥边

那么这个边双内部全部点度数之和为偶数 除掉连出去的桥边外度数之和为奇数 故不合法

然后k为奇数的时候我们仅仅须要构造两个对称的边双被一条桥边连接的图即可了

因为每一个点度数为k。因此每一边至少须要k+1个点

可是k+1个点奇偶性不合法。因此每一边至少须要k+2个点

如今问题转化成了给定一个度数数组要求构造一张原图

这个在Wc2015讲过 每次找剩余的度数最大的点

如果这个点的度数为d 那么仅仅须要向其他度数最大的d个点连边即可

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 110
using namespace std;
struct edge{
    int x,y;
    edge() {}
    edge(int _,int __):
        x(_),y(__) {}
}stack[10100];
int k,top;
int degree[M],a[M];
bool Compare(int x,int y)
{
    return degree[x] > degree[y] ;
}
int main()
{
    int i,j;
    cin>>k;
    if(~k&1)
        return puts("NO"),0;
    puts("YES");
    if(k==1)
        return puts("2 1\n1 2"),0;
    cout<<(k+2<<1)<<‘ ‘<<((k+2)*k)<<endl;
    int n=k+2;
    for(degree[1]=k-1,i=2;i<=n;i++)
        degree[i]=k;
    for(i=1;i<=n;i++)
        a[i]=i;
    for(i=1;i<=n;i++)
    {
        sort(a+1,a+n+1,Compare);
        for(j=2;j<=degree[a[1]]+1;j++)
        {
            stack[++top]=edge(a[1],a[j]);
            degree[a[j]]--;
        }
        degree[a[1]]=0;
    }
    for(i=1;i<=top;i++)
    {
        printf("%d %d\n",edges[i].x,edges[i].y);
        printf("%d %d\n",edges[i].x+n,edges[i].y+n);
    }
    printf("%d\n",1,n+1);
    return 0;
}
时间: 2024-12-05 13:18:05

codeforces #550D Regular Bridge 构造的相关文章

cf550D. Regular Bridge(构造)

题意 给出一个$k$,构造一个无向图,使得每个点的度数为$k$,且存在一个桥 Sol 神仙题 一篇写的非常好的博客:http://www.cnblogs.com/mangoyang/p/9302269.html 我简单的来说一下构造过程 首先$n$是偶数的时候无解 奇数的时候:我们拿出两个点作为桥 先构建一条桥边,对于两个端点分别做同样操作: 新建$k−1$个点,每个点向端点连边 再新建$k−1$个点,每个点向相邻的点连边 对于两层点形成的二分图,两两之间连边 /* */ #include<io

cf550D Regular Bridge

Regular Bridge An undirected graph is called k-regular, if the degrees of all its vertices are equal k. An edge of a connected graph is called a bridge, if after removing it the graph is being split into two connected components. Build a connected un

Codeforces 534C Polycarpus&#39; Dice 构造

题意:给你n个筛子,第 i 个筛子有 可以表示范围 1-a[i]的数,给你最后筛子和,问你每个筛子不可能的值有多少个. 解题思路:得到每个筛子的取值范围. 解题代码: 1 // File Name: c.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月13日 星期一 00时38分58秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #includ

Codeforces 432E Square Tiling(构造+贪心)

我们通常这么写 using (SqlDataReader drm = sqlComm.ExecuteReader()) { drm.Read();//以下把数据库中读出的Image流在图片框中显示出来. MemoryStream ms = new MemoryStream((byte[])drm["Logo"]); Image img = Image.FromStream(ms); this.pictureBox1.Image = img; } 我的写数据 private void b

Codeforces 1132A. Regular Bracket Sequence

原题链接:Codeforces 1132A. Regular Bracket Sequence 题目大意:你有\({cnt}_1,{cnt}_2,{cnt}_3,{cnt}_4\)个"((","()",")(","))",问能否将这些字符串组成一个合法的括号序列. 题解:这一道题,很明显的\({cnt}_2\)是不需要管的,对于第三种情况,它并不改变左右括号的数量差,只有第一.四情况改变,那么,很明显\({cnt}_1={cn

「日常训练」Regular Bridge(Codeforces Round 306 Div.2 D)

题意与分析 图论基础+思维题. 代码 #include <bits/stdc++.h> #define MP make_pair #define PB emplace_back #define fi first #define se second #define ZERO(x) memset((x), 0, sizeof(x)) #define ALL(x) (x).begin(),(x).end() #define rep(i, a, b) for (repType i = (a); i &

codeforce 550 D Regular Bridge

题意:建立一个连通图,它的所有点的度为k,且至少含有一个桥. 做法:先建立一个桥,再在桥两边建立两个度为k的连通图,通过这个桥连接在一起. 很显然k为偶数的时候无解. #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<v

Codeforces 482A Diverse Permutation(构造)

题目链接:Codeforces 482A Diverse Permutation 题目大意:给定N和K,即有一个1~N的序列,现在要求找到一个排序,使得说所有的|pi?pi+1|的值有确定K种不同. 解题思路:构造,1,K+1,2,K,3,K-1,... K+2,K+3 ... N. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn

Codeforces550D:Regular Bridge

An undirected graph is called k-regular, if the degrees of all its vertices are equal k. An edge of a connected graph is called a bridge, if after removing it the graph is being split into two connected components. Build a connected undirected k-regu