MLE 求条
查看原帖
MLE 求条
649315
心灵震荡楼主2024/10/18 17:24

rt,神秘 tarjan 做法,数组可能开的有点多(

#include <bits/stdc++.h>
using namespace std;

const int N = 2005, M = 4e6 + 5;
short n, m;
int tot, dfn[M], low[M], bel[M], dis[M], ans, idx, h, trg[M], stk[M], top, idd[N][N];
char s;

inline int id(int x, int y)
{
	return (x - 1) * m + y;	
}


bool vis[M];

int head2[M];
int nxt[M], aoao2;
struct edge
{
	int to, nxt;
} E[M];

inline void addedge2(int u, int v)
{
	E[++aoao2] = {v, head2[u]};
	head2[u] = aoao2;
}

inline void tarjan(int u)
{
	vis[u] = 1;
	stk[++top] = u;
	low[u] = dfn[u] = ++idx;
	int v = nxt[u];
	if(v)
	{
		if(!dfn[v])
		{
			tarjan(v);
			low[u] = min(low[u], low[v]);
		}
		else if(vis[v]) low[u] = min(low[u], dfn[v]);
	}
	if(low[u] == dfn[u])
	{
		++tot;
		while(h != u)
		{
			h = stk[top--];
			bel[h] = tot, vis[h] = 0, dis[tot]++;
		}
		trg[tot] = u;
	}
	return;
}

inline void dfs(int u)
{
	for(int i = head2[u]; i; i = E[i].nxt)
	{
		int v = E[i].to;
		dis[v] = dis[u] + 1, dfs(v);
	}
	return;
}

inline void solve()
{
	cin >> n >> m; ans = idx = tot = top = 0;
	h = -1, aoao2 = 0;
	for(short i = 1; i <= n; i++)
	for(short j = 1; j <= m; j++)
		idd[i][j] = id(i, j);
	for(short i = 1; i <= n; i++)
	for(short j = 1; j <= m; j++)
	{
		cin >> s;
		if(s == 'U' && i > 1) nxt[idd[i][j]] = idd[i - 1][j];
		if(s == 'D' && i < n) nxt[idd[i][j]] = idd[i + 1][j];
		if(s == 'L' && j > 1) nxt[idd[i][j]] = idd[i][j - 1];
		if(s == 'R' && j < m) nxt[idd[i][j]] = idd[i][j + 1];
	}
	for(short i = 1; i <= n; i++)
	for(short j = 1; j <= m; j++)
		if(!dfn[idd[i][j]]) tarjan(idd[i][j]);
	for(int i = 1; i <= n * m; i++) low[i] = vis[i] = 0;
	for(int u = 1; u <= n * m; u++)
	{
		int v = nxt[u];
		if(!v) continue;
		if(bel[u] == bel[v]) continue;
		addedge2(bel[v], bel[u]);
		low[bel[u]]++;		
	}
	for(short i = 1; i <= n; i++)
	for(short j = 1; j <= m; j++)
	{
		int isd = bel[idd[i][j]];
		if(vis[isd]) continue;
		if(low[isd]) continue;
		vis[isd] = 1;
		dfs(isd);
	}
	int xx = 1;
	for(short i = 1; i <= n; i++)
	for(short j = 1; j <= m; j++)
		if(dis[idd[i][j]] > ans) ans = dis[idd[i][j]], xx = trg[idd[i][j]];
	cout << (xx - 1) / m + 1 << ' ' << (xx - 1) % m + 1 << ' ' << ans << '\n';
	for(int i = 1; i <= n * m; i++)
		bel[i] = dfn[i] = low[i] = dis[i] = nxt[i] = head2[i] = 0;
	return;
}

int main()
{
	ios :: sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int T; cin >> T;
	while(T--) solve();
	return 0;
}
2024/10/18 17:24
加载中...