题目描述
在一个地图上有N个地窖(N<=200),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。
输入
第一行输入一个整数N
第2行输入N个整数,表示每个地窖的地雷数
之后有若干行表示2个地窖之间有路径,输入 0 0代表结束
输出
第一行输出挖地雷的顺序,之间用-隔开
第2行输出最多挖出的地雷数
样例输入 Copy
6 5 10 20 5 4 5 1 2 1 4 2 4 3 4 4 5 4 6 5 6 0 0
样例输出 Copy
3-4-5-6 34
提示
编号大的地窖没有到编号小的地窖的路径
AC代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#define N 310
using namespace std;
int n,m,k;
int nex[N],a[N];
int dist[N];
int b[N][N];
int ans;
void print(int u)
{
if(u==0)
return;
print(nex[u]);
if(nex[u]==0)
cout<<u;
else
cout<<"-"<<u;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
dist[i]=a[i];
}
cin>>m>>k;
memset(b,0,sizeof b);
while(m!=0&&k!=0)
{
b[m][k]=1;
cin>>m>>k;
}
int maxx=-0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(b[j][i]==1 && dist[j]+a[i]>dist[i])
{
dist[i]=dist[j]+a[i];
nex[i]=j;
}
}
if(maxx<dist[i])
{
maxx=dist[i];
ans=i;
}
}
print(ans);
cout<<endl;
cout<<maxx<<endl;
return 0;
}