您的位置:首页 > 其它

cf 389D Fox and Minimal path 【构造】

2017-09-05 17:31 295 查看
点击打开链接

题意:

      

           给你一个整数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;
}


         
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: