題目連結:http://codeforces.com/problemset/problem/388/B

大意是用不超過1000個點構造一張邊權為1的無向圖,使得點1到點2的最短路的個數為給定值k,其中k為不超過1e9的正整數,輸出鄰接矩陣

構造方法也不止一種

有一種分層構造方法是這樣的,

第i層的點與1號點距離為i-1

第一層放置1號點

第二層放置3號和4號點,分別與上一層的1號點相連,他們的最短路為1,且個數也為1

接下來每一層都會比上一層的點數要多1,第i+1層,首先與第i層的前i個點相連,然後第i+1個點與第i層的所有點相連

這樣構造的話,最短路個數按照層表示會是

1

1 1

1 1 2

1 1 2 4

1 1 2 4 8

1 1 2 4 8 16

這樣下去。主要就是利用了1+2+...+2^n=2^(n+1)-1 再多一個個數為1的點就能湊成下一個2的冪了

其他的構造方法還可以是不斷地分出2個岔路,再匯合,再分岔,這樣的話每個匯合點也是一個2的冪,但是要注意每個匯合點不能直接連到2號點,因為每個匯合點與1號點距離是不相等的,處理方法可以是往下拖到一條“匯流排”上,匯流排末端與2號點相連

下面是第一種構造方式的程式碼

 import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream; public class Main {
public static void main(String[] args) {
InputStream inputStream = System.in;
OutputStream outputStream = System.out;
InputReader in = new InputReader(inputStream);
PrintWriter out = new PrintWriter(outputStream);
Task solver = new Task();
solver.solve(1, in, out);
out.close();
} static class Task {
void addEdge(boolean[][] g, int u, int v) {
g[u][v] = true;
g[v][u] = true;
} public void solve(int testNumber, InputReader in, PrintWriter out) {
int k = in.nextInt();
boolean[][] g = new boolean[1001][10001];
int n = 2;
int from = 0, to = 1;
for (int p = 1, l = 1; p <= k; p <<= 1, l++) {
int nfrom = n;
for (int i = from; i < to; i++) {
addEdge(g, i, n++);
}
for (int i = from; i < to; i++) {
addEdge(g, i, n);
}
from = nfrom;
to = ++n;
}
for (int i = from + 1; i < to; i++) {
if ((k & (1 << i - from - 1)) != 0) {
addEdge(g, i, 1);
}
}
out.println(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
out.print((g[i][j] ? "Y" : "N"));
}
out.println();
}
} } static class InputReader {
private final BufferedReader reader;
private StringTokenizer tokenizer; public InputReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream));
tokenizer = null;
} public String next() {
while (tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
} public int nextInt() {
return Integer.parseInt(next());
} }
}