挖地雷

题目描述

在一个地图上有N个地窖(N20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。

输入格式

有若干行。

1行只有一个数字,表示地窖的个数N。

2行有N个数,分别表示每个地窖中的地雷个数。

3行至第N+1行表示地窖之间的连接情况:

3行有n1个数(0或1),表示第一个地窖至第2个、第3个、…、第n个地窖有否路径连接。如第3行为1 1 0 0 0 … 0,则表示第1个地窖至第2个地窖有路径,至第3个地窖有路径,至第4个地窖、第5个、…、第n个地窖没有路径。

4行有n-2个数,表示第二个地窖至第3个、第4个、…、第n个地窖有否路径连接。

… …

n+1行有1个数,表示第n-1个地窖至第n个地窖有否路径连接。(为0表示没有路径,为1表示有路径)。

输出格式

有两行

第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。

第二行只有一个数,表示能挖到的最多地雷数。

输入输出样例

输入 #1
5
10 8 4 7 6
1 1 1 0
0 0 0
1 1
1
输出 #1
 
1 3 4 5
27


分析:
本题依然可以进行dfs,由于n<=20,dfs显然不会超时,故选取每一个点,对其下一个点进行dfs即可

CODE:
 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 const int M=1005;
 8 int n,a[M];
 9 int head[M],next[M],to[M],tot;
10 int get(){
11     int res=0,f=1;
12     char c=getchar();
13     while (c>'9'||c<'0') {
14         if (c=='-') f=-1;
15         c=getchar();
16     }
17     while (c<='9'&&c>='0'){
18         res=(res<<3)+(res<<1)+c-'0';
19         c=getchar();
20     }
21     return res*f;
22 }
23 void add(int u,int v){
24     next[++tot]=head[u];
25     head[u]=tot;
26     to[tot]=v;
27     return ;
28 }
29 int ans;
30 int f[M],ansl[M],cnt;
31 bool flag;
32 void dfs(int u,int tot,int now){
33     if (tot>ans) {
34         flag=true;
35         ans=tot;
36         for (int i=1;i<=now;i++) ansl[i]=f[i];
37         cnt=now;
38     }
39     for (int i=head[u];i;i=next[i]){
40         int v=to[i];
41         f[now]=v;
42         dfs(v,tot+a[v],now+1);
43         f[now]=0;
44     }
45     return ;
46 }
47 int main(){
48     n=get();
49     for (int i=1;i<=n;i++) a[i]=get();
50     for (int i=1;i<=n;i++){
51         for (int j=i+1;j<=n;j++){
52             int ok=get();
53             if (ok) add(i,j);
54         }
55     }
56     for (int i=1;i<=n;i++){
57         flag=false;
58         dfs(i,a[i],2);
59         if (flag) ansl[1]=i,f[1]=i;
60     }
61     for (int i=1;i<cnt;i++) printf ("%d ",ansl[i]);
62     printf ("
%d",ans);
63     return 0;
64 }


 
原文地址:https://www.cnblogs.com/kanchuang/p/11337834.html