挖地雷问题

来源: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 }
View Code

 

posted on 2013-06-16 15:47  冰尨  阅读(163)  评论(0)    收藏  举报

导航