cf550D Regular Bridge
Posted zhber
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 undirected k-regular graph containing at least one bridge, or else state that such graph doesn‘t exist.
Input
The single line of the input contains integer k (1?≤?k?≤?100) — the required degree of the vertices of the regular graph.
Output
Print "NO" (without quotes), if such graph doesn‘t exist.
Otherwise, print "YES" in the first line and the description of any suitable graph in the next lines.
The description of the made graph must start with numbers n and m — the number of vertices and edges respectively.
Each of the next m lines must contain two integers, a and b (1?≤?a,?b?≤?n, a?≠?b), that mean that there is an edge connecting the vertices a and b. A graph shouldn‘t contain multiple edges and edges that lead from a vertex to itself. A graph must be connected, the degrees of all vertices of the graph must be equal k. At least one edge of the graph must be a bridge. You can print the edges of the graph in any order. You can print the ends of each edge in any order.
The constructed graph must contain at most 106 vertices and 106 edges (it is guaranteed that if at least one graph that meets the requirements exists, then there also exists the graph with at most 106 vertices and at most 106 edges).
Example
1
YES
2 1
1 2
Note
In the sample from the statement there is a suitable graph consisting of two vertices, connected by a single edge.
题意是要搞出个无向图,至少包含一条边是桥,而且每个点度数都是k
显然方便的构造是桥的两边是对称的
假如有两个联通块A,B通过一个桥联通,那么A和B之间除了桥以外不能有其他边。
考虑A块,假设有n个点,除去有一个点连出去一个桥,A块中其他边带来的度数之和应当是nk-1。
显然一条边一次带来2的度数,那么nk-1是偶数,nk是奇数,n、k都是奇数。
因此对于k是偶数的肯定无解
然后就是瞎鸡儿构造时间(不过为什么我看标答的点比我构造的少这么多)
假设A块的s点连了桥,那么s还需要连恰好k-1个点,标号成1~k-1,因为k是奇数所以k-1是偶数
然后对k-1个点两两分组,每组两个点a,b现在都只和s连上,再新建k-1个点,a和b都分别和k-1个新点连上,这样a和b度数都是k
新的k-1个点再两两连上变成完全图,这样每个新点都和k-2个其他新点连上,加上a和b恰好度数为k
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 #include<cmath> 7 #include<queue> 8 #include<deque> 9 #include<set> 10 #include<map> 11 #include<ctime> 12 #define LL long long 13 #define inf 0x7ffffff 14 #define pa pair<int,int> 15 #define mkp(a,b) make_pair(a,b) 16 #define pi 3.1415926535897932384626433832795028841971 17 #define mod 100007 18 using namespace std; 19 inline LL read() 20 { 21 LL x=0,f=1;char ch=getchar(); 22 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 23 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 24 return x*f; 25 } 26 int k,n,m; 27 inline void put(int a,int b) 28 { 29 printf("%d %d\n%d %d\n",a,b,a+n/2,b+n/2); 30 } 31 int main() 32 { 33 k=read(); 34 if (k%2==0){puts("NO");return 0;} 35 puts("YES"); 36 n=2*(k+(k-1)/2*(k-1));m=2*(k-1+(k-1)/2*((k-1)+k*(k-1)/2))+1; 37 printf("%d %d\n1 %d\n",n,m,1+n/2); 38 39 for (int i=2;i<=k;i++)put(1,i); 40 int cnt=k; 41 for (int i=1;i<=(k-1)/2;i++) 42 { 43 for (int j=1;j<k;j++) 44 { 45 put(1+i,++cnt); 46 put(1+(k-1)/2+i,cnt); 47 } 48 for (int j=cnt-k+2;j<=cnt;j++) 49 for (int l=j+1;l<=cnt;l++) 50 put(j,l); 51 } 52 }
以上是关于cf550D Regular Bridge的主要内容,如果未能解决你的问题,请参考以下文章
「日常训练」Regular Bridge(Codeforces Round 306 Div.2 D)
codeforces #550D Regular Bridge 构造