题目描述
在一个地图上有N个地窖(N≤20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。
输入格式
有若干行。
第1行只有一个数字,表示地窖的个数N。
第2行有N个数,分别表示每个地窖中的地雷个数。
第3行至第N+1行表示地窖之间的连接情况:
第3行有n−1个数(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 }