Codeforces 550D. Regular Bridge 构造
求一個圖,每一個點的度數都為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為奇數的話都能夠用這個方案構造出來.
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) input 1 output YES 2 1 1 2 NoteIn 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<to;j++){if(i==2*k+4||i==4+k||i==1+k||i==1) continue;if(j==2*k+4||j==4+k||j==1+k||j==1) continue;if(used[j]==true) continue;if(edge[i][j]==true){used[i]=used[j]=true;//cutedge[i][j]=edge[j][i]=false;//linkedge[i][goal]=edge[goal][i]=true;edge[j][goal]=edge[goal][j]=true;// flagflag=true;break;}}}tk-=2;}}void build_tuan(int from ,int to){for(int i=from;i<=to;i++){for(int j=i+1;j<=to;j++){edge[i][j]=edge[j][i]=true;}}}void sovle(int k){midl=k+2; midr=k+3;build_tuan(1,k+1);edge[1][midl]=edge[midl][1]=true;edge[1][k+1]=edge[k+1][1]=false;edge[k+1][midl]=edge[midl][k+1]=true; cut_and_link(2,k+1,midl);edge[midl][midr]=edge[midr][midl]=true;build_tuan(k+4,2*k+4);edge[2*k+4][midr]=edge[midr][2*k+4]=true;edge[k+4][2*k+4]=edge[2*k+4][k+4]=false;edge[k+4][midr]=edge[midr][k+4]=true;cut_and_link(k+4,2*k+4,midr);}Main(){Scanner in = new Scanner(System.in);k=in.nextInt();if(k%2==0){System.out.println("No");return ;}System.out.println("Yes");if(k==1){System.out.println("2 1\n1 2");}else{sovle(k);int num=2*k+4,cnt=0;for(int i=1;i<=num;i++)for(int j=i+1;j<=num;j++)if(edge[i][j]) cnt++;System.out.printf("%d %d\n",num,cnt);for(int i=1;i<=num;i++){for(int j=i+1;j<=num;j++){if(edge[i][j]){System.out.printf("%d %d\n",i,j);}}}}}public static void main(String[] args){new Main();} }
轉載于:https://www.cnblogs.com/gccbuaa/p/6957388.html
總結
以上是生活随笔為你收集整理的Codeforces 550D. Regular Bridge 构造的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓7.0拍照遇到 Uri暴露错误
- 下一篇: angularjs 整合bootstra