挖地雷
题目描述
输入
第二行有n个整数表示每个地窖的地雷数
以下有若干行,每行有两个数x,y表示x可以到y,保证x小于y。
最后一行有两个0,表示输入结束
输出
第二行为最多挖出的地雷数
样例输入
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 a[201],ans[201],ji[201];
bool tu[201][201],zou[201];
int n,x,y;
int dfs(int k)
{
if(zou[k])
{
return ans[k];
}
zou[k]=1;ans[k]=a[k];
for(int i=1;i<=n;i++)
{
if(tu[k][i]==1)
{
int jii=dfs(i);
if(jii+a[k]>ans[k])
{
ans[k]=jii+a[k];
ji[k]=i;
}
}
}
return ans[k];
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
cin>>x>>y;
while(x!=0&&y!=0)
{
tu[x][y]=1;
cin>>x>>y;
}
for(int i=1;i<=n;i++)
{
dfs(i);
}
int jians=ans[1],jii=1;
for(int i=2;i<=n;i++)
{
if(ans[i]>jians)
{
jians=ans[i];
jii=i;
}
}
cout<<jii;
while(ji[jii])
{
cout<<"-";
jii=ji[jii];
cout<<jii;
}
cout<<endl<<jians;
}