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;
}