您的位置:首页 > 其它

HDU 1224 Free DIY Tour

2014-07-24 10:25 375 查看
题意:给出每个城市interesting的值,和城市之间的飞行路线,求一条闭合路线(从原点出发又回到原点)

使得路线上的interesting的值之和最大

因为要输出路径,所以用pre数组来保存前驱

在输出路径的时候,我是把前驱一次放在route数组里面,然后再将整个数组反转过来

另外,看别人的题解里面还有一种递归的方法求路径,挺有新意,学习了

我的做法:

//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 5100;
bool flight[110][110];
int city[110];
int dp[110];
int pre[110];
int route[110];

void putroute(int p)
{
if(p == 0)
return;
putroute(pre[p]);
printf("%d->", p);
}

int main(void)
{
#ifdef LOCAL
freopen("1224in.txt", "r", stdin);
#endif

int N, kase;
scanf("%d", &N);
for(kase = 1; kase <= N; ++kase)
{
if(kase > 1)    printf("\n");

int n;
scanf("%d", &n);
int i;
for(i = 1; i <= n; ++i)
scanf("%d", &city[i]);
city[n + 1] = 0;

int m, from, to;
memset(flight, 0, sizeof(flight));
scanf("%d", &m);
for(i = 1; i <= m; ++i)
{
scanf("%d%d", &from, &to);
flight[from][to] = true;
}

memset(dp, 0, sizeof(dp));
memset(pre, 0, sizeof(pre));
int j;
for(i = 2; i <= n + 1; ++i)
for(j = 1; j < i; ++j)
if(flight[j][i]
&& (dp[j] + city[i]) > dp[i])
{
dp[i] = dp[j] + city[i];
pre[i] = j;
}

printf("CASE %d#\n", kase);
printf("points : %d\n", dp[n + 1]);

printf("circuit : ");
putroute(pre[n + 1]);
printf("1\n");
}

return 0;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: