题目大意:
就是现在给出一个k, (1 <= k <= 10^9)
输出一个点数不超过1000的无向图, 所有边权值都是1, 使得从点1到点2的最短路的条数为k条
输出格式为输出一个邻接矩阵
大致思路:
就是构造一个图, 关键就是怎么构造, 首先要求点数不能超过1000, 有一种很容易想到的构造是, 如果现在要有2*10^4条那么在1, 2之间先1连3, 4, 然后3, 4与组(5, 6, 7, 8, 9, 10, 11, 12, 13, 14)中的点互连, 也就是3, 4与这10个点相通, 然后这10个点与下一组10个点相连..重复4个10个点的组最后由2*10*10*10*10条长度为5个路, 连至2, 长度为6
按照这个思想构图, 找到输入的k的最高位, 当最高位是10^i 时, 以长度 i + 1 为最短路长度, 在其他10*10...*10的组的末尾与2相连时中间插入几个点调节最短路长度即可
代码如下:
Result : Accepted Memory : 1012 KB Time : 78 ms
/* * Author: Gatevin * Created Time: 2015/2/28 14:05:57 * File Name: Shana.cpp */ #include<iostream> #include<sstream> #include<fstream> #include<vector> #include<list> #include<deque> #include<queue> #include<stack> #include<map> #include<set> #include<bitset> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<cctype> #include<cmath> #include<ctime> #include<iomanip> using namespace std; const double eps(1e-8); typedef long long lint; lint K; int bit[20]; vector <int> v; char M[1010][1010]; int main() { cin>>K; if(K == 1) { printf("2\nNY\nYN\n"); return 0; } if(K == 2) { printf("4\nNNYY\nNNYY\nYYNN\nYYNN\n"); return 0; } printf("1000\n"); for(int i = 1; i <= 1000; i++) for(int j = 1; j <= 1000; j++) M[i][j] = 'N'; int len = 0; for(int i = 1; i <= 10; i++) { bit[i] = K % 10; K /= 10; if(K == 0) { len = i + 1; break; } } int cnt = 3; for(int i = 10; i >= 1; i--) { if(bit[i] == 0) continue; for(int j = 0; j < bit[i]; j++) { v.push_back(cnt + j); M[cnt + j][1] = M[1][cnt + j] = 'Y'; } cnt += bit[i]; for(int k = 1; k < i; k++) { for(unsigned int j = 0; j < v.size(); j++) { int now = v[j]; for(int g = 0; g < 10; g++) { M[cnt + g][now] = M[now][cnt + g] = 'Y'; } } v.clear(); for(int j = 0; j < 10; j++) v.push_back(j + cnt); cnt += 10; } int nowlen = i; if(nowlen + 1 == len) { for(unsigned int k = 0; k < v.size(); k++) M[v[k]][2] = M[2][v[k]] = 'Y'; v.clear(); continue; } else { for(unsigned int k = 0; k < v.size(); k++) M[v[k]][cnt] = M[cnt][v[k]] = 'Y'; v.clear(); nowlen++; while(nowlen + 1 < len) { M[cnt + 1][cnt] = M[cnt][cnt + 1] = 'Y'; nowlen++; cnt++; } M[cnt][2] = M[2][cnt] = 'Y'; cnt++; } } for(int i = 1; i <= 1000; i++) { for(int j = 1; j <= 1000; j++) printf("%c", M[i][j]); printf("\n"); } return 0; }