求一個圖,每個點的度數都為K而且必須至少要有一個橋.
構造題:
只有k為奇數的時候有解, 構造這樣的一個圖,左邊一團有 k+1 個點 , 右邊一團也有 k+1 個點, 中間經過 m1 , m2 連著一個橋.
如果左右兩團是完全圖,則每個點的度數都為k, 現在考慮如何通過m1,m2連接起來而又不改變度數.
顯然這個圖是對稱的,只考慮左邊和點m1,m1和m2是一個橋,要連一條邊,m1 和左邊的團某個點A要連在一起,又要連一條邊,這時A點的度數多了,要和團裡的其他點B斷掉一條邊,為了保持B的度數不變,B再連一條邊到m1,這時m1的度就至少為3了,然後將m1的度補全. 每次從左邊團中刪掉一條邊,然後將這條邊的兩個點連到m1上就可以了.m1的度每次增加2,所以如果k為奇數的話都可以用這樣的方法構造出來.
D. Regular Bridge time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output
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.
InputThe single line of the input contains integer k (1?≤?k?≤?100) — the required degree of the vertices of the regular graph.
OutputPrint "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 aand 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).
Sample test(s) input1output
YES 2 1 1 2Note
In the sample from the statement there is a suitable graph consisting of two vertices, connected by a single edge.
import java.util.*; import java.math.*; public class Main { int k,midl,midr; boolean[][] edge = new boolean[330][330]; boolean[] used = new boolean[330]; void cut_and_link(int from,int to,int goal) { int tk=k-3; while(tk>0) { boolean flag=false; for(int i=from;i<to&&flag==false;i++) {="" if(used[i]="=true)" continue;="" for(int="" j="i+1;j