关闭

Codeforces 388B Fox and Minimal path(构造最短路条数为N的图)

标签: 算法ACM图论Codeforces构造
507人阅读 评论(0) 收藏 举报
分类:
B. Fox and Minimal path
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Fox Ciel wants to write a task for a programming contest. The task is: "You are given a simple undirected graph with n 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 to k?

Input

The first line contains a single integer k (1 ≤ k ≤ 109).

Output

You should output a graph G with n vertexes (2 ≤ n ≤ 1000). There must be exactly k shortest paths between vertex 1 and vertex 2 of the graph.

The first line must contain an integer n. Then adjacency matrix G with n rows and n columns must follow. Each element of the matrix must be 'N' or 'Y'. If Gij is 'Y', then graph G has a edge connecting vertex i and vertex j. Consider the graph vertexes are numbered from 1 to n.

The graph must be undirected and simple: Gii = 'N' and Gij = 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.

Examples
Input
2
Output
4
NNYY
NNYY
YYNN
YYNN
Input
9
Output
8
NNYYYNNN
NNNNNYYY
YNNNNYYY
YNNNNYYY
YNNNNYYY
NYYYYNNN
NYYYYNNN
NYYYYNNN
Input
1
Output
2
NY
YN
Note

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,构造一个最短路径数为N的图,以邻接矩阵的形式输出。


解题思路:

    开始想的是因数分解,不过这样对于非常大的质数会超过1000个点的限制。后来在吃饭的时候灵光一闪想到的正确的方法( ̄▽ ̄)

    任何一个数都可以用2进制表示,而且1e9也才二十几位而已。所以我们就可以把N拆成2^a+2^b+2^c…。于是我们就可以构造一条主链,表示主要路径,一条辅链,表示2^x。如图

    因为主链已经表示了1,所以我们要把N-=1,然后对N进行转化为二进制数,如果第i位为1就把主链第i+1层和辅链第i层的一个节点连接,相当于增加了2^I条路径。这样就可以得到满足题目要求的图了。


AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn=1000+3;
int N,size;//需要路径数、图的层数
bool G[maxn][maxn];//邻接矩阵

void add_edge(int a,int b)//加边
{
    G[a][b]=G[b][a]=true;
}

int main()
{
    scanf("%d",&N);
    --N;
    int tmp=N;
    while(tmp>0)
    {
        ++size;
        tmp/=2;
    }
    if(size==0)//N==1时特判
    {
        printf("2\nNY\nYN\n");
        return 0;
    }
    //构造主链和辅链
    add_edge(1,3);
    add_edge(1,4);
    add_edge(1,5);
    add_edge(size*3,2);
    for(int i=1;i<size;++i)
    {
        add_edge(i*3,(i+1)*3);
        add_edge(i*3+1,(i+1)*3+1);
        add_edge(i*3+2,(i+1)*3+2);
        add_edge(i*3+1,(i+1)*3+2);
        add_edge(i*3+2,(i+1)*3+1);
    }
    int now=0;
    while(N>0)
    {
        ++now;
        if(N&1)//增加2^now条路径
        {
            if(now==size)
                add_edge(2,3*now+1);
            else add_edge(3*(now+1),3*now+1);
        }
        N/=2;
    }
    size=size*3+2;
    printf("%d\n",size);
    for(int i=1;i<=size;++i)//输出邻接矩阵
    {
        for(int j=1;j<=size;++j)
            putchar(G[i][j]?'Y':'N');
        putchar('\n');
    }
    
    return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

求最短路条数之类的~~~

Flowery Trails 时间限制: 1 Sec  内存限制: 128 MB 题目描述 In order to attract more visitors, the manager of  a national park had the idea of pl...
  • hahaAll
  • hahaAll
  • 2016-06-03 21:58
  • 644

【PAT】Emergency(最短路条数-SPFA)

【PAT】Emergency(最短路条数-SPFA) As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scatt...
  • ChallengerRumble
  • ChallengerRumble
  • 2016-05-07 17:55
  • 1165

算法学习-最短路径条数问题(队列相关)

题目 给定如图所示的无向连通图,嘉定图中所有边的权值都为1,显然,从原点A到终点T的最短路径有多条,求不同的最短路径的数目。 分析 权值相同的最短路径问题,则单元点Dijkstra算法退化成BFS广度优先搜索,假定起点为0,终点为N: 结点步数step[0...N-1]初始化为0,记...
  • HelloNiGeSB
  • HelloNiGeSB
  • 2016-11-14 17:46
  • 801

CDOJ_1147 (最短路条数)

分析:最短路条数问题。求最短路的条数只需要在dijkstra上面加一个数组sumt[]记录就行,sumt[v] 表示从源点 s 出发到 v 的最短路条数,当 dist[v] > dist[u] + d[u][v] 时,更新sumt[v] 的值就是 sumt[u];当 dist[v] == di...
  • jhgkjhg_ugtdk77
  • jhgkjhg_ugtdk77
  • 2015-11-18 20:03
  • 1106

最短路条数计数

最短路计数
  • tangzhide123yy
  • tangzhide123yy
  • 2017-11-04 17:01
  • 54

poj3463Sightseeing(最短路条数+次短路条数)

//poj 3463 //次短路长度为最短路长度+1 //最短路条数+次短路条数 //分四种情况更新,练习了dijstra的更新 //路条数用加法原理更新 #include #include #include #include using namespace std; const int N=101...
  • u012936765
  • u012936765
  • 2015-07-27 17:18
  • 224

POJ_3463_Sightseeing(最短路/次短路条数)

题意:给你一个有向图,如果次短路长度刚好比最短路大1,那么输出最短路条数与次短路条数之和,否者直接输出最短路的条数。
  • jhgkjhg_ugtdk77
  • jhgkjhg_ugtdk77
  • 2015-04-16 21:19
  • 568

走格子/棋盘问题 有多少条路径可走

选择题:在如下8*6的矩阵中,请计算从A移动到B一共有多少走法?要求每次只能向上或向右移动一格,并且不能经过P。()               B           ...
  • yusiguyuan
  • yusiguyuan
  • 2013-10-19 21:15
  • 8620

最短路径算法(Shortest-path Algorithms)

0) 引论 正如名字所言,最短路径算法就是为了找到一个图中,某一个点到其他点的最短路径或者是距离。 最短路径算法一般分为四种情况: a) 无权重的最短路径 b) 有权重的最短路径 c) 边的权重为负的图 d) 无环的图 ps:上面的情况针对的都是有向图。 1) 无权重的最短路径 下图是...
  • changyuanchn
  • changyuanchn
  • 2013-12-03 11:43
  • 7850

求有向图最短路径条数

求解有向图的最短路径主要有Dijkstra和Floyd算法。 求最短路径的条数问题方法类似,还可以使用dfs深度遍历的方法,易于理解但效率低,出现超时的情况。 三种方法如下: 注:前两个方法关键都需要一个数组来存储最短路径条数。 ci[i][j];//记录顶点i到j的最短路径条数 ...
  • xiao2yang1998
  • xiao2yang1998
  • 2018-01-04 20:16
  • 12
    个人资料
    • 访问:52338次
    • 积分:2243
    • 等级:
    • 排名:第19375名
    • 原创:176篇
    • 转载:2篇
    • 译文:0篇
    • 评论:32条
    文章分类
    最新评论