萌新dfs45 其余全tle 第一次竞赛 求改进
查看原帖
萌新dfs45 其余全tle 第一次竞赛 求改进
631628
h2531985197楼主2022/10/30 12:34
#include<bits/stdc++.h>
#define ull unsigned long long

using namespace std;

vector <int> g[2501];

int n, m, k;
ull point[2501];
ull ans;
int vis[2501];

bool canBack[2501];//可以在k步以内到1的 

void input();
void dfs2(int v, int step);
void init();
void dfs(int cnt, int zhuan, ull s, int v);

int main()
{	
	input();
	init();
	dfs(0, 0, 0, 1);
	
	cout << ans;
	
	return 0;
}

void dfs(int cnt, int zhuan, ull s, int v)//cnt已参观景点数 zhuan已中转数 s总分数 v当前景点 
{
	int u, i;
	
	if(cnt == 4 && canBack[v] == 1)
	{
		ans = max(ans, s);
		return;
	}
	if(cnt == 4)
	{
		return;
	}
	
	for(i = 0; i < g[v].size(); i++)
	{
		u = g[v][i];
		if(vis[u] == 0)//作为参观的 
		{
			vis[u] = 1;
			dfs(cnt + 1, 0, s + point[u], u);
			vis[u] = 0;
		}
		if(zhuan < k)//作为中转的 
		{
			dfs(cnt, zhuan + 1, s, u);
		}
	}
}

void init()
{
	int i, u;
	
	vis[1] = 1;
	for(i = 0; i < g[1].size(); i++)//0步能到1的 
	{
		u = g[1][i];
		canBack[u] = 1;
	}
	for(i = 1; i <= k; i++)//k步以内能到的 
	{
		dfs2(1, i);
	}
}

void dfs2(int v, int step)
{
	int i, u;
	
	if(step < 0)
	{
		return;
	}
	
	for(i = 0; i < g[v].size(); i++)
	{
		u = g[v][i];
		if(canBack[u] == 0)
		{
			canBack[u] = 1;
			dfs2(u, step - 1);	
		}
	}
}

void input()
{
	int i, u, v;
	
	cin >> n >> m >> k;
	for(i = 2; i <= n; i++)
	{
		cin >> point[i];
	}
	for(i = 1; i <= m; i++)
	{
		cin >> u >> v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
}
2022/10/30 12:34
加载中...