题意:
给你一个整数n,让你构造一个地图,该地图包含n个顶点,要求你构造的地图顶点1->顶点2 的最短路条数为n。
题解:
已知n可以拆成二进制形式。
那么我们可以很容易先构造一个2^31条最短路的地图,接下来再构造一条长度为31的最短路。
接下来按n的二进制位数在个地图和路上连边即可,
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int ma[maxn][maxn];
int n;
int bit[50];
int fac(int x){
int cnt=0;
while(x){
bit[++cnt]=x%2;
x/=2;
}
return cnt;
}
void unicom(int u,int v){
ma[u][v]=ma[v][u]=1;
}
int main(){
scanf("%d",&n);
int len=fac(n);
int pos=3;
unicom(1,3);
unicom(1,4);
for(int i=1;i<=32;++i){
unicom(pos,pos+2);
unicom(pos,pos+3);
unicom(pos+1,pos+2);
unicom(pos+1,pos+3);
pos+=2;
}
int beg=pos+2;
pos+=2;
for(int i=1;i<=31;++i){
unicom(pos,pos+1);
pos++;
}
unicom(2,pos);
if(bit[1]) unicom(1,beg);
beg+=2;
int t=5;
for(int i=2;i<=len;++i){
if(bit[i]){
unicom(beg,t);
}
beg++;
t+=2;
}
puts("100");
for(int i=1;i<=100;++i){
for(int j=1;j<=100;++j){
if(ma[i][j])printf("%c",'Y');
else printf("%c",'N');
}puts("");
}
return 0;
}