题目描述
在一个地图上有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 <bits/stdc++.h>
using namespace std;
int main()
{
int n;while(cin>>n)
{
int d[201];memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
cin>>d[i];
int ari[201][201];
memset(ari,0,sizeof(ari));
while(1)
{
int u,v;
cin>>u>>v;
if(!u&&!v) break;
ari[u][v]=1; //u,v连通
}
int maxx=0;int s=0;
int hou[201]={0};
memset(hou,0,sizeof(hou));
for(int i=n;i>0;i--) //从最后一点开始查找
{
int m=0;int tj=0;
for(int j=i;j<=n;j++) //在当前点之后的点
{
if(ari[i][j]&&d[j]>m) //连通
{
m=d[j];
tj=j;
}
} //tj=可使d[i]最大的j
d[i]+=d[tj];hou[i]=tj; //更新当前点,记录路径
if(maxx<d[i])
{
maxx=d[i];
s=i;
}
}
cout<<s;s=hou[s];
while(s) //s为终点时,hou[s]=0
{
cout<<'-'<<s;
s=hou[s];
}
cout<<endl<<maxx<<endl;
}
return 0;
}