求助为什么不能dfs
查看原帖
求助为什么不能dfs
174065
PeterWinchester楼主2021/7/23 09:46

rt,我搞不明白,这题的数据规模,只有54个字母,应该可以dfs吧,为什么TLE(TLE了6个点)呢?代码:

#define N 3000

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

struct Edge {int next, to;} edge[N];

int n, head[200], len_path, num_edge, other[N];
char path[N], tmp[N];
bool vst[N], sign[200];

void add_edge(int u, int v);
bool dfs(char u, int len, int num);

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		char u, v ;
		cin >> u >> v;
		sign[u] = sign[v] = true;
		add_edge(u, v);
	}
	for (int i = 0; i < N; i++) path[i] = 123;
	bool flag = false;
	char i = 'A';
	while (i != 'z')
	{
		if (sign[i])
		{
			flag = dfs(i, 1, 0);
			if (flag) break;	
		}
		if (i != 'Z') i++;
		else i = 'a';
	}
	if (flag)
	{
		for (int i = 1; i <= len_path; i++) cout << path[i];
		cout << endl;
	}
	else cout << "No Solution" << endl;
	return 0;
}

void add_edge(int u, int v)
{
	edge[++num_edge].next = head[u];
	edge[num_edge].to = v;
	head[u] = num_edge;
	other[num_edge] = num_edge + 1;
	
	edge[++num_edge].next = head[v];
	edge[num_edge].to = u;
	head[v] = num_edge;
	other[num_edge] = num_edge - 1;
}

bool dfs(char u, int len, int num)
{
	tmp[len] = u;
	if (num == n)
	{
		bool upd = false;
		for (int i = 1; i <= len; i++)
		{
			if (tmp[i] < path[i])
			{
				upd = true;
				break;
			}
			else if (tmp[i] > path[i]) break;
		}
		if (upd)
		{
			for (int i = 1; i <= len; i++)
				path[i] = tmp[i];
			len_path = len;
		}
		return true;
	}
	bool res = false;
	for (int i = head[u]; i; i = edge[i].next)
	{
		int v = edge[i].to;
		if (!vst[i])
		{
			vst[i] = vst[other[i]] = true;
			if (dfs(v, len + 1, num + 1)) res = true;
			vst[i] = vst[other[i]] = false;
		}

	}
	return res;
}

2021/7/23 09:46
加载中...