51,720
社区成员




这道题一看就是拓扑排序的性质,首先他强调了并规定路径都是单向的,而且无环,那么我们就可以利用拓扑排序的性质来做这道题(做完后我看了一下标签,拓扑图,果然如此)。先对它进行拓扑排序,然后从后往前的递推公式
递推公式如下 dp[u]=max(dp[u],dp[v]),最后加上自己这个节点的地雷数,不过这道还需要输出路径,开个path数组,记录一下,没什么时间,代码写的比较糙。
AC代码如下:
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int d[201];
vector<int> e[201];
int a[201];
int seq[201];
int dp[201];
int path[201]={0};
int topsort(int n)
{
queue<int> que;
for(int i=1;i<=n;i++)
{
if(d[i]==0)
que.push(i);
}
int cnt=0;
while(!que.empty())
{
int top=que.front();
seq[cnt++]=top;
que.pop();
for(int i=0;i<e[top].size();i++)
{
int v=e[top][i];
d[v]--;
if(d[v]==0)
{
que.push(v);
}
}
}
return cnt;
}
int main()
{
int n,i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
int c,b;
cin>>b>>c;
while(b)
{
e[b].push_back(c);
d[c]++;
cin>>b>>c;
}
topsort(n);
int res=0,p;
for(i=n-1;i>=0;i--)
{
dp[ seq[i] ]=0;
for(int j=0;j<e[seq[i]].size();j++)
{
int v=e[seq[i] ][j];
if(dp[v]>dp[seq[i]] )
{
dp[seq[i]]=dp[v];
path[ seq[i] ]=v;
}
}
dp[ seq[i] ]+=a[seq[i]];
if(res<dp[ seq[i] ])
{
res=dp[ seq[i] ];
p=seq[i];
}
}
while(p)
{
cout<<p;
p=path[p];
if(p==0)
{
break;
}
cout<<"-";
}
cout<<endl;
cout<<res<<endl;
return 0;
}