Codeforces 389D Fox and Minimal path【构造+二进制思维】好题!
来源:互联网 发布:淘宝关键词top100 编辑:程序博客网 时间:2024/05/18 16:39
Fox Ciel wants to write a task for a programming contest. The task is: "You are given a simple undirected graph withn vertexes. Each its edge has unit length. You should calculate the number of shortest paths between vertex 1 and vertex 2."
Same with some writers, she wants to make an example with some certain output: for example, her birthday or the number of her boyfriend. Can you help her to make a test case with answer equal exactly tok?
The first line contains a single integer k (1 ≤ k ≤ 109).
You should output a graph G with n vertexes (2 ≤ n ≤ 1000). There must be exactlyk shortest paths between vertex 1 and vertex 2 of the graph.
The first line must contain an integer n. Then adjacency matrixG with n rows andn columns must follow. Each element of the matrix must be 'N' or 'Y'. IfGij is 'Y', then graphG has a edge connecting vertex i and vertex j. Consider the graph vertexes are numbered from 1 ton.
The graph must be undirected and simple: Gii = 'N' andGij = Gji must hold. And there must be at least one path between vertex 1 and vertex 2. It's guaranteed that the answer exists. If there multiple correct answers, you can output any of them.
2
4NNYYNNYYYYNNYYNN
9
8NNYYYNNNNNNNNYYYYNNNNYYYYNNNNYYYYNNNNYYYNYYYYNNNNYYYYNNNNYYYYNNN
1
2NYYN
In first example, there are 2 shortest paths: 1-3-2 and 1-4-2.
In second example, there are 9 shortest paths: 1-3-6-2, 1-3-7-2, 1-3-8-2, 1-4-6-2, 1-4-7-2, 1-4-8-2, 1-5-6-2, 1-5-7-2, 1-5-8-2.
题目大意:
让你构造出来一个图,里边包含N个点,并且保证从1到2的最短路的条数为K个,求一个可行解。
N必须小于等于1000。
思路:
1、一开始的思路是将给出的数K因子分解,但是想到如果K是一个很大的素数,那么结果是不可行的,因为题干要求点的数量小于等于1000.
2、然后考虑,无论一个数多大,都能用二进制数来表示,那么我们考虑将输入进来的K先转成二进制数。
比如21:10101
那么我们考虑将其弄成2^0+2^2+2^4即可,对应我们很容易搞出来2^4的图:
那么那么我们2^0,直接从3连出来一条分路,只要保证从1-3-分路-2的长度和从1到2的最短路长度相同即可:
那么2^2同理,我们从9分离出来一条分路即可(因为从1到9上边的路有4种走法,那么再从9连入20,那么就多出来4种走法):
3、那么按照上述过程写出来代码即可、
Ac代码:
#include<stdio.h>#include<string.h>using namespace std;int map[1005][1005];int a[50];int main(){ int k; while(~scanf("%d",&k)) { int cont=0; while(k) { a[cont++]=k%2; k/=2; } int now=3; map[1][3]=map[3][1]=1; for(int i=0;i<cont-1;i++) { map[now][now+1]=1; map[now+1][now]=1; map[now][now+2]=1; map[now+2][now]=1; map[now+1][now+3]=1; map[now+3][now+1]=1; map[now+2][now+3]=1; map[now+3][now+2]=1; now+=3; } int tmp=now+1; map[now][2]=1; map[2][now]=1; for(int i=0;i<(cont-2)*2;i++) { map[tmp][tmp+1]=1; map[tmp+1][tmp]=1; tmp++; } map[tmp][now]=1; map[now][tmp]=1; int pos=now+1; now=tmp; int contz=1; for(int i=0;i<cont;i++) { if(a[i]==1) { map[contz*3][pos]=1; map[pos][contz*3]=1; } contz++; pos+=2; } printf("%d\n",now); for(int i=1;i<=now;i++) { for(int j=1;j<=now;j++) { if(map[i][j]==1) { printf("Y"); } else printf("N"); } printf("\n"); } }}
- Codeforces 389D Fox and Minimal path【构造+二进制思维】好题!
- Codeforces 389D Fox and Minimal path【构造+二进制思维】好题!
- cf 389D Fox and Minimal path 【构造】
- Codeforces 388B Fox and Minimal path(构造)
- Codeforces 388B Fox and Minimal path(构造)
- Codeforces Round #228 (Div. 2) D - Fox and Minimal path
- codeforces 388B Fox and Minimal path
- Codeforces B. Fox and Minimal path
- CodeForces 388B Fox and Minimal path
- Codeforces Round #228 (Div. 1)-B-Fox and Minimal path
- Codeforces #228 D2D / D1B:Fox and Minimal path
- Codeforces Round #228 Div1 B Fox and Minimal path
- Codeforces 388B Fox and Minimal path 构图
- Codeforces Round #228 (Div. 1) B. Fox and Minimal path
- CF 好题集锦 PART 0 & #388 B Fox and Minimal path 题解
- Codeforces 388B Fox and Minimal path(构造最短路条数为N的图)
- Codeforces 388B Fox and Minimal path(构造最短路条数为N的图)
- Codeforces 550D Regular Bridge【思维+构造】好题!
- java集合概述
- POJ 3734 Blocks(矩阵快速幂)
- MD5加密的util
- Error: Your project contains C++ files but it is not using a supported native build system
- uva1352 Colored Cubes
- Codeforces 389D Fox and Minimal path【构造+二进制思维】好题!
- 百度地图在scrollview里面滑动冲突解决以及跳转到百度地图app的方法
- Linux字符设备驱动
- C——变量
- 启动Tomcat提示:指定的服务未安装
- Redis 集群方案介绍
- 动态规划问题CombinationSum
- Matlab匿名函数使用规则
- Android AndroidUtilCode-Activity相关工具类