dfs40分求调
查看原帖
dfs40分求调
1255092
xinqiji114514楼主2024/4/4 16:08
#include <bits/stdc++.h>
using namespace std;
const int N = 30;
int g[N][N];
int n;
int a[N];
int ans;
bool vis[N];
int cnt, path;
bool pa[N];
vector<int> res;

int dfs(int x) {
	cnt += a[x];
	vis[x] = true;
	for (int i = 0; i <= n; i++) {
		if (g[x][i] == 1)
			if (!vis[x + i])
				dfs(x + i);
	}

	return cnt;
}

void pathfs(int t) {
	res.push_back(t);
	for (int i = 1; i <= n - t; i++) {
		if (g[t][i])
			if (!pa[t + i]) {
				pa[t + i] = true;
				pathfs(t + i);
			}
	}
	return ;
}

int main() {
	scanf("%d", &n);

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

	for (int i = 1; i <= n - 1; i++)
		for (int j = 1; j <= n - i; j++)
			scanf("%d", &g[i][j + 1]);


	for (int i = 1; i <= n ; i++) {
		cnt = 0;
		if (!vis[i]) {
			int t = ans;
			ans = max(ans, dfs(i));
			if (ans != t)
				path = i;
		}
	}

	pathfs(path);

	sort(res.begin(), res.end());

	for (int i = 0; i < res.size(); i++)
		printf("%d ", res[i]);

	printf("\n");

	printf("%d", ans);
	return 0;
}
2024/4/4 16:08
加载中...