Problem Description
在一个地图上有n个地窖(n<=200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,也不存在可以从
一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连
接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。
Input
输入有多组数据,每组数据的第一行为一个整数n,表示地窖的个数,第二行为n个地窖中的地雷数。下面多行数据以0,0结束,每行为两个数x和y,表示从x可以到y。
Output
对于每组数据输出两行,第一行为挖地雷的顺序,第二行为最多挖出的地雷数
Sample Input
6 5 10 20 5 4 5 1 2 1 4 2 4 3 4 4 5 4 6 5 6 0 0
Sample Output
3-4-5-6 34
#include<iostream> #include<cstring> using namespace std; int main() { long f[201]={0},w[201],c[201]={0}; bool a[201][201]={0}; long i,j,n,x,y,l,k,max; while(cin>>n) { memset(f,0,sizeof(f)); memset(w,0,sizeof(w)); memset(c,0,sizeof(c)); memset(a,false,sizeof(a)); for(i=1;i<=n;i++) cin>>w[i]; //输入每个地窖中的地雷数 do { cin>>x>>y; if((x!=0)&&(y!=0)) a[x][y]=true; }while((x!=0)&&(y!=0)); f[n]=w[n]; //从后面的f[n]往前逐个找出所有的 f[i] for(i=n-1;i>=1;i--) { l=0;k=0; for(j=i+1;j<=n;j++) if((a[i][j])&&(f[j]>l)) {l=f[j]; k=j;} f[i]=l+w[i]; //保存从第 i个地窖起能挖到最大地雷 数 c[i]=k; //k地窖是 i地窖最优路 径的后继 点 printf("%d \n",c[i]); } k=1; for(j=2;j<=n;j++) if(f[j]>f[k]) k=j; max=f[k]; cout<<k; k=c[k]; while(k!=0) {cout<<"-"<<k; k=c[k];} cout<<endl; cout<<max<<endl; } return 0; }