선인장도
#include
using namespace std;
#define maxn 500000
int n, m, N, timer, ans;
int fa[maxn], dfn[maxn], low[maxn];
int f[maxn][2], id[maxn], S[maxn];
int tmp[maxn], q[maxn];
int F[maxn][2], SS[maxn];
struct edge
{
int cnp, head[maxn], to[maxn], last[maxn], w[maxn];
edge() { cnp = 1; }
void add(int u, int v, int ww)
{
to[cnp] = v, last[cnp] = head[u], w[cnp] = ww, head[u] = cnp ++;
to[cnp] = u, last[cnp] = head[v], w[cnp] = ww, head[v] = cnp ++;
}
}E1, E2;
int read()
{
int x = 0, k = 1;
char c;
c = getchar();
while(c < '0' || c > '9') { if(c == '-') k = -1; c = getchar(); }
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * k;
}
void Solve(int u, int v)
{
++ N; int ID = 0, pre = 1;
for(int i = v; i != fa[u]; i = fa[i])
S[i] = pre ++, id[i] = ++ ID;
S[N] = S[u], S[u] = 0;
for(int i = v; i != fa[u]; i = fa[i])
E2.add(N, i, min(S[i], S[N] - S[i]));
}
void Tarjan(int u)
{
dfn[u] = low[u] = ++ timer;
for(int i = E1.head[u]; i; i = E1.last[i])
{
int v = E1.to[i];
if(v == fa[u]) continue;
if(!dfn[v])
{
fa[v] = u; Tarjan(v);
low[u] = min(low[u], low[v]);
}
else low[u] = min(low[u], dfn[v]);
if(low[v] > dfn[u]) E2.add(u, v, 1);
}
for(int i = E1.head[u]; i; i = E1.last[i])
{
int v = E1.to[i];
if(dfn[u] < dfn[v] && fa[v] != u) Solve(u, v);
}
}
void update(int u, int w)
{
if(w <= f[u][1]) return;
if(w < f[u][0]) f[u][1] = w;
else f[u][1] = f[u][0], f[u][0] = w;
}
bool cmp(int a, int b) { return id[a] < id[b]; }
int Work(int u)
{
int head = 1, tail = 1, cnt = 1, ans = 0, len = 0;
for(int i = E2.head[u]; i; i = E2.last[i])
tmp[++ cnt] = f[E2.to[i]][0], len ++;
for(int i = 1; i <= len; ++ i)
tmp[++ cnt] = tmp[i];
q[head] = 1;
for(int i = 2; i <= cnt; ++ i)
{
while(head < tail && i - q[head] > len / 2) ++ head;
ans = max(ans, tmp[i] + tmp[q[head]] + i - q[head]);
while(head <= tail && tmp[i] - i > tmp[q[tail]] - q[tail] ) -- tail;
q[++ tail] = i;
}
return ans;
}
void dfs(int u, int ff)
{
for(int i = E2.head[u]; i; i = E2.last[i])
{
int v = E2.to[i];
if(v == ff) continue; else dfs(v, u);
update(u, f[v][0] + E2.w[i]);
}
if(u <= n) ans = max(ans, f[u][1] + f[u][0]);
else ans = max(ans, Work(u));
}
int main()
{
N = n = read(), m = read();
for(int i = 1; i <= m; i ++)
{
int tot = read(), u, pre;
for(int j = 1; j <= tot; j ++)
{
u = read(); if(j == 1) { pre = u; continue; }
E1.add(u, pre, 1); pre = u;
}
}
Tarjan(1);
dfs(1, 0);
printf("%d
", ans);
return 0;
}
전재 대상:https://www.cnblogs.com/twilight-sx/p/9230863.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.