这题写tarjan为啥这么慢
查看原帖
这题写tarjan为啥这么慢
237893
donkeys楼主2021/7/19 11:23

最长的一个点跑了1.22s,总用时3.48s 莫非是我平时写代码习惯不好常数太大了 以下为源代码

#include<iostream>
#include<list>
using namespace std;
const int N = 500005;
int n, quest, root;
int head[N], nxt[N << 1], to[N << 1], tot;
int tag[N];
int fa[N];
list<int>quelist[N], quenum[N];
int answer[N];
int ask(int x)
{
	if (x == fa[x])
		return x;
	return fa[x] = ask(fa[x]);
}
void tarjan(int st)
{
	tag[st] = 1;
	for (int i = head[st]; i; i = nxt[i])
	{
		if (!tag[to[i]])
		{
			tarjan(to[i]);
			fa[to[i]] = st;
		}
	}
	for (list<int>::iterator i = quelist[st].begin(), j = quenum[st].begin(); i != quelist[st].end(); ++i, ++j)
	{
		if (tag[*i] == 2)
		{
			answer[*j] = ask(*i);
		}
	}
	tag[st] = 2;
}
void add(int f, int t)
{
	to[++tot] = t, nxt[tot] = head[f], head[f] = tot;
}
int main()
{
	cin >> n >> quest >> root;
	for (int i = 1; i <= n; ++i)
		fa[i] = i;
	for (int i = 1, a, b; i < n; ++i)
	{
		cin >> a >> b;
		add(a, b), add(b, a);
	}
	for (int i = 0, a, b; i < quest; ++i)
	{
		cin >> a >> b;
		quelist[a].push_back(b), quelist[b].push_back(a);
		quenum[a].push_back(i), quenum[b].push_back(i);
	}
	tarjan(root);
	for (int i = 0; i < quest; ++i)
	{
		cout << answer[i] << endl;
	}
	return 0;
}

莫非是cin和stl太慢了吗

2021/7/19 11:23
加载中...