小样例过了,大样例超时也能过,洛谷直接段错误,求助
查看原帖
小样例过了,大样例超时也能过,洛谷直接段错误,求助
232472
吾爱Cpp楼主2022/10/30 06:35
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n, m, k;
const int N = 3000;
int side[N][N];//x -> y
int num[N];//number x -> y
int mark[N];
int ways[N][N];//lowest x -> y
int  ans = 0;
queue<int> bfs;
int vis[N];
void add(int x, int y)
{
	num[x]++;
	side[x][num[x]] = y;
}
void init()
{
	for(int i = 1; i <= n; i++)
	{
		for(int k = 1; k <= n; k++) vis[k] = 0;
		int t = 0;
		bfs.push(i);
		vis[i] = 1;
		bfs.push(-1);
		while(1)
		{
			int top = bfs.front();
			bfs.pop();
			if(bfs.empty()) break;
			if(top ==-1)
			{
				t++;
				bfs.push(-1);
				continue;
			}
			ways[i][top] = t;
			for(int j = 1; j <= num[top]; j++)
			{
				if(vis[side[top][j]] == 0)
				{
					bfs.push(side[top][j]);
					vis[side[top][j]] = 1;
				}
			}
		}
	}
}
void dfs(int start, int times, int sum)
{
	if(times == 4)
	{
		if(ways[start][1] > k + 1) ans = max(0, ans);
		else ans = max(sum, ans);
		return;
	}
	for(int i = 1; i <= n; i++)
	{
		if(vis[i] != 1 && i != start && ways[start][i] <= k + 1)
		{
			vis[i] = 1;
			dfs(i, times + 1, sum + mark[i]);
			vis[i] = 0;
		}
	}
}
int main()
{
	freopen("holiday.in","r", stdin);
	freopen("holiday.out", "w", stdout);
	cin >> n >> m >> k;
	for(int i = 2; i <= n; i++)
	{
		cin >> mark[i];
	}
	for(int i = 1; i <= m; i++)
	{
		int x, y;
		cin >> x >> y;
		add(x, y);
		add(y, x);
	}
	init();
	for(int i = 1; i <= n; i++) vis[i] = 0;
	vis[1] = 1;
	dfs(1, 0, 0);
	cout << ans;
	return 0;
}

思路是先BFS遍历每个点到其他点的“最少乘车次数”然后DFS

之前在考场过样例的时候也输出过中间数据,也没出现段错误的问题,这是为什么?

2022/10/30 06:35
加载中...