该怎么记录路径啊
查看原帖
该怎么记录路径啊
434157
Co27Ti22楼主2020/12/26 12:01

用的是链式前向星存图+记忆化搜索 应该是能搜出答案(大概),但像我这么写得话怎么保存路径呢?

#include<bits/stdc++.h>
using namespace std;

const int maxn = 25;
const int maxm = 500;
int n;
int w[maxn]; // 每个点点权
int mem[maxn];	// 记忆化
int used[maxn];

// 链式前向星
int head[maxn];
int tot;
struct edge {
	int next, to;
}e[maxm];

void add(int u, int v)
{
	e[++tot].to = v;
	e[tot].next = head[u];
	head[u] = tot;
}

int dfs(int u)
{
	if (used[u]) {
		return 0;
	}
	if (mem[u]) {
		return mem[u];
	}
	mem[u] = w[u];
	
	for (int i = head[u]; i; i = e[i].next) {
		memset(used, 0, sizeof(used));
		used[u] = 1;
		int v = e[i].to;
		int cnt = dfs(v);
		mem[u] = max(mem[u], cnt + w[u]);
	}

	return mem[u];
}

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &w[i]);
	}
	for (int i = 1; i < n; i++) {
		for (int j = i + 1; j <= n; j++) {
			int t;
			scanf("%d", &t);
			if (t) {
				add(i, j);
			}
		}
	}

	int res = 0;
	for (int i = 1; i <= n; i++) {
		res = max(res, dfs(i));
	}
	printf("%d", res);

	return 0;
}
2020/12/26 12:01
加载中...