这题我们用动态规划做
//【例9.6】挖地雷
#include <iostream>
using namespace std;
const int N = 210;
int n, dp[N], a[N], pre[N];
bool to[N][N], isfirst = true;
void print(int x) {
if (x == -1)
return ;
print(pre[x]);
if (isfirst) {
isfirst = false;
} else {
printf ("-");
}
printf ("%d", x);
}
int main() {
scanf ("%d", &n);
for (int i = 1; i <= n; i ++)
scanf ("%d", &a[i]);
int x, y;
while (cin >> x >> y) {
if (x == 0 && y == 0)
break;
to[x][y] = true;
}
/*
状态设计
dp[i] 从任意一点到i的最大和
状态转移
dp[i] 由可以转移到这个点的节点决定
初始化
pre[i] = -1;
dp[i] = a[i]
输出
max(dp[1~n])
*/
for (int i = 1; i <= n; i ++) {
dp[i] = a[i];
pre[i] = -1;
for (int j = 1; j <= n; j ++) {
if (to[j][i] && dp[i] < dp[j] + a[i]) {
dp[i] = dp[j] + a[i];
pre[i] = j;
}
}
}
int ans = dp[1];
for (int i = 2; i <= n; i ++) {
ans = max(ans, dp[i]);
}
for (int i = 1; i <= n; i ++) {
if (dp[i] == ans) {
print(i);
puts("");
break;
}
}
printf ("%d", ans);
return 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
*/
原题链接:信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)
禁止转载,创作不易, 留个赞再走吧(●'◡'●)