Submission #71197448


Source Code Expand

Copy
#include <stdio.h>
int N;
int E[16][16];
int memo[16][1 << 16];
int calc(int pos, int left) {
int ans = -1;
int i;
if (left == 0) return E[pos][0];
if (memo[pos][left]) return ~memo[pos][left];
for (i = 0; i < N; i++) {
if ((left >> i) & 1) {
int candidate = calc(i, left & ~(1 << i)) + E[pos][i];
if (ans < 0 || candidate < ans) ans = candidate;
}
}
return ~(memo[pos][left] = ~ans);
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>

int N;
int E[16][16];

int memo[16][1 << 16];

int calc(int pos, int left) {
	int ans = -1;
	int i;
	if (left == 0) return E[pos][0];
	if (memo[pos][left]) return ~memo[pos][left];
	for (i = 0; i < N; i++) {
		if ((left >> i) & 1) {
			int candidate = calc(i, left & ~(1 << i)) + E[pos][i];
			if (ans < 0 || candidate < ans) ans = candidate;
		}
	}
	return ~(memo[pos][left] = ~ans);
}

int main(void) {
	int i, j;
	if (scanf("%d", &N) != 1) return 1;
	for (i = 0; i < N - 1; i++) {
		for (j = i + 1; j < N; j++) {
			if (scanf("%d", &E[i][j]) != 1) return 1;
			E[j][i] = E[i][j];
		}
	}
	if (N == 2) {
		puts("0 0");
	} else {
		printf("%d %d\n", N, calc(0, (1 << N) - 2));
	}
	return 0;
}

/*

道路N-1本では、良くて木にしかならず、この状態では頂点を1個外すとダメになる所がありそう
道路N本で、ぐるっとすれば、条件を満たす (十分条件) → 多分最小本数

※ただしN=2のときは頂点1個外すと1個だけになるので、適当な道路1本あればいい
(というかそもそも道路の候補が1本しかないだろう)
↑嘘……ではないが、「残りの全地区」でいいので、道路はなくてもいい

道路N本でぐるっとしない → 多分次数1の頂点ができて、そこに繋がるところを消すと死ぬ

最初の地域からスタートして、適当な順でたどって、最後の地域から最初の地域に戻る

*/

Submission Info

Submission Time
Task A - 特別作戦
User mikecat
Language C (gcc 12.2.0)
Score 100
Code Size 1521 Byte
Status AC
Exec Time 10 ms
Memory 3352 KiB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 24
Set Name Test Cases
All 00-sample, 01-maximum, 02-minimum, 03-flat, 50-random-00, 50-random-01, 50-random-02, 50-random-03, 50-random-04, 50-random-05, 50-random-06, 50-random-07, 50-random-08, 50-random-09, 50-random-10, 50-random-11, 50-random-12, 50-random-13, 50-random-14, 50-random-15, 50-random-16, 50-random-17, 50-random-18, 50-random-19
Case Name Status Exec Time Memory
00-sample AC 0 ms 1764 KiB
01-maximum AC 10 ms 3348 KiB
02-minimum AC 0 ms 1576 KiB
03-flat AC 10 ms 3348 KiB
50-random-00 AC 0 ms 1664 KiB
50-random-01 AC 1 ms 1808 KiB
50-random-02 AC 0 ms 1692 KiB
50-random-03 AC 0 ms 1740 KiB
50-random-04 AC 0 ms 1668 KiB
50-random-05 AC 0 ms 1612 KiB
50-random-06 AC 2 ms 2112 KiB
50-random-07 AC 0 ms 1680 KiB
50-random-08 AC 5 ms 2416 KiB
50-random-09 AC 10 ms 3352 KiB
50-random-10 AC 0 ms 1684 KiB
50-random-11 AC 5 ms 2424 KiB
50-random-12 AC 0 ms 1660 KiB
50-random-13 AC 0 ms 1504 KiB
50-random-14 AC 3 ms 2016 KiB
50-random-15 AC 1 ms 1688 KiB
50-random-16 AC 0 ms 1744 KiB
50-random-17 AC 2 ms 2144 KiB
50-random-18 AC 5 ms 2372 KiB
50-random-19 AC 1 ms 1672 KiB


2025-11-24 (Mon)
06:29:16 +09:00