#include<bits/stdc++.h>
using namespace std;
int n;
bool g[500][500];
int a[500],f[500],bb[100010],ans[100010],cnt;
int ma,k;
void prt(int x)
{
while(x!=0){
ans[++cnt]=x;
x=bb[x];
}
return;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int x,y;
while(1){
scanf("%d%d",&x,&y);
if(x==0&&y==0) break;
g[x][y]=true;//小x到大y有路径
}
for(int i=1;i<=n;i++)
f[i]=a[i];
for(int i=1;i<=n;i++) //更新i
{
for(int j=1;j<i;j++) //当前j->i
{
if(g[j][i]) //有路
{
//f[i]=max(f[i],f[j]+a[i]); //拿a[i]的金块,从j->i
if(f[j]+a[i]>f[i]){
f[i]=f[j]+a[i];
bb[i]=j;
}
}
}
if(f[i]>ma)
{
ma=f[i];
k=i;
}
}
prt(k);
sort(a+1,a+n+1);
for(int i=cnt;i>=1;i--){
cout<<ans[i];
if(i!=1)
cout<<"-";
}
puts("");
cout<<ma;
return 0;
}
dp__挖地雷
最新推荐文章于 2023-11-22 11:37:41 发布