题目描述】
在一个地图上有n个地窖(n≤200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,且保证都是小序号地窖指向在序号地窖,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。
【输入】
第一行:地窖的个数;
第二行为依次每个地窖地雷的个数;
下面若干行:
xi yixi yi //表示从xixi可到yiyi,xi<yixi<yi。
最后一行为"0 0"表示结束。
【输出】
k1−k2−…−kvk1−k2−…−kv //挖地雷的顺序
挖到最多的雷。
【输入样例】
6
5 10 20 5 4 5
1 2
1 4
2 4
3 4
4 5
4 6
5 6
0 0
【输出样例】
3-4-5-6
34
【来源】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstring>
#include<algorithm>
#define maxn 305
#define inf 0x3f3f3f3f
using namespace std;
int n,a[maxn][maxn],w[maxn];
int f[maxn];
int pre[maxn];
int main()
{
memset(pre,0,sizeof(pre));
//memset(f,0,sizeof(f));
memset(a,0,sizeof(a));
cin>>n;
for(int i=1;i<=n;i++)
cin>>w[i];
for(int i=1;i<=n;i++)
f[i]=w[i];
int x,y;
while(cin>>x>>y)
{if(x==0&&y==0)
break;
a[x][y]=1;
}
pre[n]=0;
for(int i=n-1;i>=1;i--)
for(int j=i+1;j<=n;j++)
if(a[i][j]>0&&f[i]<f[j]+w[i])
{f[i]=f[j]+w[i];
pre[i]=j;
}
int maxl=-10000;
int k=1;
for(int i=1;i<=n;i++)
if(f[i]>maxl)
{
maxl=f[i];
k=i;
}
cout<<k;
k=pre[k];
while(k!=0)
{
cout<<"-"<<k;
k=pre[k];
}
cout<<endl;
cout<<maxl<<endl;
return 0;
}