题目描述
在一个地图上有 N 个地窖(N<=200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。
输入
N //地窖的个数
W1,W2,……WN //每个地窖中的地雷数
X1,Y1 //表示从 X1 可到 Y1
X2,Y2
……
0,0 //表示输入结束
输出
K1-K2-…-Kv //挖地雷的顺序
MAX //最多挖出的地雷数
样例数据
输入 #1 复制
6 5 10 20 5 4 5 1 2 1 4 2 4 3 4 4 5 4 6 5 6 0 0
输出 #1 复制
3-4-5-6 34
参考代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long f[201]={0},w[201],c[201]={0};
bool a[1001][1001]={0};
long long i,j,n,x,y,l,k,maxx;
memset(f,0,sizeof(f));
memset(c,0,sizeof(c));
memset(a,false,sizeof(a));
cin>>n;
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];
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];
c[i]=k;
}
k=1;
for(j=2;j<=n;j++)
if(f[j]>f[k])
k=j;
maxx=f[k];
cout<<k;
k=c[k];
while(k!=0)
{
cout<<"-"<<k;
k=c[k];
}
cout<<endl;
cout<<maxx<<endl;
}