http://codeforces.com/problemset/problem/990/D
質問の意味:
構成次数n単純な無向グラフG、ように通信分岐の数、およびその相補グラフの連結成分の数B。
ソリューション:
一見したところで、タイトル、および無知な外観、ああ?それは私がどのようにマップを構築するのですか???
または野菜ああ、誰か他の人の問題の解決策を見て、それから学びます。。。
参考まで:https://www.cnblogs.com/siuginhung/p/9172602.html
これは設定の問題です。
ためのn次の単純な無向グラフこれは、図Gを通信しない場合、それは、図の通信の補数です。
証明:
最初は、単純な非有向グラフ内でノードG場合、U、V(U≠ V)が接続されていない場合、その補数値は、U、V、通信を結合しました。
図G = <V、E>をに分割されたk分岐通信、= <Viと、Eiは>のGiが、I 1,2、...、Kを=。V任意の2点取るU、V(U≠ V)を。
若u∈Vi,v∈Vj,且i≠j,则u、v在图G中不连通,则u、v必然在其补图中连通;
若u,v∈Vi,则必然存在w∈Vj,且i≠j,使得u、w和v、w在补图中连通。
于是,在题中,a、b中至少有一个为1。
接下来构造连通分支:若一个n阶简单无向图有k(k≥2)个连通分支,则可以构造其连通分支分别为{1},{2},...,{k-1},{k,k+1,...,n}。
代码如下:
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <math.h> 6 #include <algorithm> 7 #include <vector> 8 #include <stack> 9 #include <queue> 10 #include <set> 11 #include <map> 12 #include <sstream> 13 const int INF=0x3f3f3f3f; 14 typedef long long LL; 15 #define Bug cout<<"---------------------"<<endl 16 const int mod=1e9+7; 17 const int maxn=2e5+10; 18 using namespace std; 19 20 int G[1005][1005]; 21 22 int main() 23 { 24 int n,a,b; 25 scanf("%d %d %d",&n,&a,&b); 26 if((a!=1&&b!=1)||(n==2||n==3)&&(a==1&&b==1)) 27 printf("NO\n"); 28 else 29 { 30 printf("YES\n"); 31 if(a==1) 32 { 33 for(int i=1;i<=n;i++) 34 { 35 G[i][i]=0; 36 for(int j=i+1;j<=n;j++) 37 G[i][j]=G[j][i]=1; 38 } 39 for(int i=b;i<n;i++) 40 G[i][i+1]=G[i+1][i]=0; 41 } 42 else 43 { 44 memset(G,0,sizeof(G)); 45 for(int i=a;i<n;i++) 46 { 47 G[i][i+1]=G[i+1][i]=1; 48 } 49 } 50 for(int i=1;i<=n;i++) 51 { 52 for(int j=1;j<=n;j++) 53 printf("%d",G[i][j]); 54 printf("\n"); 55 } 56 } 57 return 0; 58 }