AtCoder ABC 016 A&B&C
A - 12月6日
private void solveA() {
int m = nextInt();
int d = nextInt();
out.print(m % d == 0 ? "YES" : "NO");
}
B - A±B Problem
private void solveB() {
int a = nextInt();
int b = nextInt();
int c = nextInt();
boolean p = a + b == c;
boolean m = a - b == c;
if (p && m) {
out.println("?");
} else if (!p && !m) {
out.println("!");
} else if (p && !m) {
out.println("+");
} else if (!p && m) {
out.println("-");
}
}
C - 友達の友達
- 無向グラフの頂点間の距離を求める
- 友達を頂点とする
- 友達との距離は1(友達間の距離は同じ)
- 友達の友達は頂点間の距離が2
- 友達の友達の友達は頂点間の距離が3
そろそろワーシャルフロイド法以外での解き方覚えないと。。。
private void solveC() {
int n = nextInt();
int m = nextInt();
int[] a = new int[m];
int[] b = new int[m];
int[][] graph = new int[n][n];
for (int i = 0; i < n; i++) {
//MAXで埋めておく
Arrays.fill(graph[i], Integer.MAX_VALUE / 2);
//自分への移動コストは0
graph[i][i] = 0;
}
for (int i = 0; i < m; i++) {
a[i] = nextInt() - 1;
b[i] = nextInt() - 1;
//隣接行列の作成
graph[a[i]][b[i]] = 1;
graph[b[i]][a[i]] = 1;
}
//ワーシャルフロイド法
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
graph[j][k] = Integer.min(graph[j][k], graph[j][i] + graph[i][k]);
}
}
}
/*
* 自分からの移動コスト
* 1=友達
* 2=友達の友達
* 3=友達の友達の友達
* 4=友達の友達の友達の友達・・・
* 以下続く
*/
for (int i = 0; i < graph.length; i++) {
int res = 0;
for (int j = 0; j < graph.length; j++) {
res += graph[i][j] == 2 ? 1 : 0;
}
out.println(res);
}
}