zoukankan      html  css  js  c++  java
  • Codeforces Round #228 (Div. 1) B. Fox and Minimal path 构造

    B. Fox and Minimal path

    题目连接:

    http://codeforces.com/contest/388/problem/B

    Description

    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.

    Sample Input

    2

    Sample Output

    4
    NNYY
    NNYY
    YYNN
    YYNN

    Hint

    题意

    你需要构造一个图,使得1到2的最短路恰好有k条

    题解:

    拆成二进制,比如9 = 2^0+2^3

    二进制的最短路就非常好构造,就2*2*2这样去构造就好了

    然而这样裸的构造的话,点数可能会超过1000个点

    所以你再压缩一下点的个数,复用一下就好了

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 3200;
    int mp[maxn][maxn];
    int k,bit[32],tot=3,max_len;
    int getid()
    {
        return tot++;
    }
    int main()
    {
        scanf("%d",&k);
        int id1=1,id2=1,id3=getid();
        while(k)
        {
            if(k%2)mp[id1][id3]=1,mp[id2][id3]=1;
            k/=2;if(k==0)break;
            int id4=getid(),id5=getid(),id6=getid();
            mp[id1][id4]=1,mp[id1][id5]=1;
            mp[id2][id4]=1,mp[id2][id5]=1;
            mp[id3][id6]=1;
            id1=id4,id2=id5,id3=id6;
        }
        mp[id3][2]=1;
        int Max = getid()-1;
        printf("%d
    ",Max);
        for(int i=1;i<=Max;i++,cout<<endl)for(int j=1;j<=Max;j++)
        if(mp[i][j]||mp[j][i])printf("Y");else printf("N");
    }
  • 相关阅读:
    IOS 11 通讯录手机号「隐形字符」的 Bug
    本地添加const参数 防止短信接口恶意调用
    javascript阿拉伯数字 转 汉字中文数字
    js去掉数组的空字符串
    Chrome 清除某个特定网站下的缓存
    vue-cli中的babel配置文件.babelrc详解
    提交到github报错Please tell me who you are
    跨域问题
    js单线程、js任务队列、异步操作
    Java 异常
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5451951.html
Copyright © 2011-2022 走看看