挖地雷问题
来源:NOIP1996(提高组)第三题(有改动)
【问题描述】
在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。如图3
图3
当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。
【输入文件】
N: (表示地窖的个数)
W1,W2,W3,……WN (表示每个地窖中埋藏的地雷数量)
A12…………… . A1N 地窖之间连接路径(其中Aij=1表示地窖i,j
A23…………..A2N 之间是否有通路:通Aij=1,不通Aij==0)
……..
AN-1 AN
【输出文件】
K1--K2--……….KV (挖地雷的顺序)
MAX (挖地雷的数量)
【输入样例】
5
10,8,4,7,6
1 1 1 0
0 0 0
1 1
1
【输出样例】
1 -> 3 -> 4 -> 5
max=27
1 #include <stdio.h> 2 #include <memory.h> 3 #define MAX 21 4 int _tmain(int argc, _TCHAR* argv[]) 5 { 6 int a[MAX][MAX], w[MAX], path[MAX], N, opt[MAX]; 7 scanf_s("%d", &N); 8 for(int i = 1; i <= N; i++){ 9 scanf_s("%d", &w[i]); 10 11 } 12 for (int i = 0; i < MAX; i++) 13 { 14 path[i] = 0; 15 opt[i] = 0; 16 for (int j = 0; j < MAX; j++) 17 { 18 a[i][j] = 0; 19 } 20 } 21 for (int i = 1; i <= N; i++) 22 { 23 for (int j = i+1; j <= N; j++) 24 { 25 scanf_s("%d", &a[i][j]); 26 } 27 } 28 for (int i = N; i > 0; i--) 29 { 30 for (int j = i+1; j <= N; j++) 31 { 32 if(a[i][j] == 1 && opt[i] < opt[j]){ 33 opt[i] = opt[j]; 34 path[i] = j; 35 } 36 } 37 opt[i] += w[i]; 38 } 39 int ans = 0, start; 40 for(int i = 1; i <= N; i++){ 41 if(ans < opt[i]){ 42 ans = opt[i]; 43 start = i; 44 } 45 } 46 while (path[start]) 47 { 48 printf("%d->", start); 49 start = path[start]; 50 } 51 printf("%d\n", start); 52 printf("%d\n", ans); 53 return 0; 54 }
浙公网安备 33010602011771号