(1224)HDU

来源:互联网 发布:全国矢量数据 编辑:程序博客网 时间:2024/05/16 05:12
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>




#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff


using namespace std;
/*
DP:属于决策性DP,不断的判断在联通的前提下,是否是最大。因为只能从一个位置不断向下拓展。所以遍历一遍就可以了。
转移方程 :dp[i] = max(dp[i],dp[j] + w[i]) j<i;
*/
int ma[509][509];
int dp[1009];//选择第i点时的最大值
int f[1009];
int a[1009];
int aa[1009];
int w[1009];


int main()
{
    int t;
    int d = 1;
    scanf("%d",&t);
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        memset(ma,0,sizeof(ma));
        int n;
        scanf("%d",&n);
        for(int i = 1; i<=n; i++)
        {
            scanf("%d",&w[i]);
        }
        w[n+1] = 0;//最后一点的价值为0
        int m;
        scanf("%d",&m);
        for(int i = 1; i<=m; i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            ma[a][b] = 1;//a - b联通
        }
        f[1] = -1;//路径的头为 - 1
        for(int i = 2;i<=n+1;i++)
        {
            for(int j = 1;j<i;j++)
            {
               if(ma[j][i]&&dp[i]<dp[j]+w[i])
               {
                   dp[i] = dp[j] + w[i];
                   f[i] = j;//不断的存储父亲
               }
            }
        }
        int k = n+1;
        int s = 0;
        while(f[k]!=-1)
        {
            aa[s++] = f[k];//保存路径
            k = f[k];
        }
        if(d!=1)
            cout<<endl;
        printf("CASE %d#\n",d++);
        printf("points : %d\n",dp[n+1]);//经过的最大值就是dp[n+1];
         printf("circuit : ");
        for(int i = s-1;i>=0;i--)
        {
            cout<<aa[i]<<"->";
        }
        cout<<1<<endl;
    }
    return 0;
}
0 0
原创粉丝点击