5294 挖地雷
时间限制: 1 s
空间限制: 1000 KB
题目等级 : 黄金 Gold
题目描述
Description
在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从第一个地窖开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。
输入描述
Input Description
输入文件mine.in有若干行。
第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表示有路径)。
输出描述
Output Description
输出文件wdl.out有两行数据。
第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。
第二行只有一个数,表示能挖到的最多地雷数。
样例输入
Sample Input
5 10 8 4 7 6 1 1 1 0 0 0 0 1 1 1
样例输出
Sample Output
1 3 4 5 27
数据范围及提示
Data Size & Hint
(N<=20)
1 #include<iostream> 2 using namespace std; 3 4 int di[30]; 5 int map[30][30]; 6 int pre[30]; //前驱 7 int f[30]; 8 int n,m,maxn,ans,w,c; 9 bool flag; 10 void print(int a) //输出 11 { 12 if(!a)return ; 13 print(pre[a]); 14 cout<<a<<" "; 15 } 16 int main() 17 { 18 cin>>n; 19 for(int i=1;i<=n;++i)cin>>di[i]; 20 for(int i=1;i<n;++i) 21 for(int j=i+1;j<=n;++j) 22 { 23 cin>>m; 24 if(m==1) 25 { 26 map[j][i]=1;flag=1; 27 } 28 } 29 if(!flag) //特判 30 { 31 for(int i=1;i<=n;++i) 32 { 33 if(di[i]>=ans) //等号不能少 34 { 35 ans=di[i]; 36 c=i; 37 } 38 } 39 cout<<c<<endl<<ans; 40 return 0; 41 } 42 f[1]=di[1]; 43 for(int i=2;i<=n;++i) 44 { 45 maxn=0; 46 for(int j=1;j<=i;++j) 47 { 48 if(f[j]>maxn&&map[i][j]) 49 { 50 maxn=f[j]; 51 f[i]=f[j]+di[i]; 52 c=j; 53 } 54 } 55 pre[i]=c; 56 if(f[i]>ans) 57 { 58 ans=f[i]; 59 w=i; 60 } 61 } 62 print(w); 63 cout<<endl<<ans; 64 return 0; 65 }