http://acm.hdu.edu.cn/showproblem.php?pid=1224
看起来很复杂其实是非常简单的dp……
题意说明了只有低往高走的情况
因此可以从从小到大遍历各点,更新每条边终点的点的最大interest
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<stack>
using namespace std;
int value[111];
vector<int> Edges[111];
int dp[111];
int pre[111];
int main()
{
cin.sync_with_stdio(false);
int n;
int m;
int CASE;
cin>>CASE;
for (int C=1;C<=CASE;C++)
{
cin>>n;
for (int i=1;i<=n;i++)
{
Edges[i].clear();
cin>>value[i];
}
value[n+1]=0;
cin>>m;
for (int i=1;i<=m;i++)
{
int tmp1,tmp2;
cin>>tmp1>>tmp2;
Edges[tmp1].push_back(tmp2);
}
//根据题意,到达一个点获得的最大interst只和他前面的点有关
//初始化
for (int i=1;i<=n+1;i++)
dp[i]=0;
for (int i=1;i<=n;i++)//遍历每个点
{
for (int j=0;j<Edges[i].size();j++)
{
int To(Edges[i][j]);
if (dp[To]<dp[i]+value[To])
{
pre[To]=i;
dp[To]=dp[i]+value[To];
}
}
}
//下面是输出
cout<<"CASE "<<C<<"#"<<endl;
cout<<"points : "<<dp[n+1]<<endl;
stack<int> pt;
int tp(pre[n+1]);
while (tp!=1)
{
pt.push(tp);
tp=pre[tp];
}
cout<<"circuit : "<<1;
while (!pt.empty())
{
cout<<"->"<<pt.top();
pt.pop();
}
cout<<"->"<<1;
cout<<endl;
if (C!=CASE)
cout<<endl;
}
return 0;
}