-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblock-cut-tree.sublime-snippet
81 lines (77 loc) · 1.61 KB
/
block-cut-tree.sublime-snippet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<snippet>
<content><![CDATA[
vector<pll>g[N];
vector<int>tree[N];
int dp[N][LN],visited[N],lvl[N],depth[N],pre[N],isbridge[N],block[N],start[N],finish[N];
queue<int>q[N];
int t =0 ;
void getbridges(int u,int p)
{
visited[u] = 1;
pre[u] = depth[u] = t++;
for(auto k:g[u])
{
int v = k.F;
if(v == p)continue;
if(visited[v])
{
depth[u] = min(pre[v],depth[u]);
}
else
{
dfs(v,u);
depth[u] = min(depth[u],depth[v]);
if(depth[v]>pre[u])
isbridge[k.S] = 1;
}
}
}
int blockno = 1;
void makeblocks(int u,int p)
{
visited[u] = 1;
block[u] = blockno;
q[block[u]].push(u);
while(!q[block[u]].empty())
{
int uu = q[block[u]].front();q[block[u]].pop();
for(auto k:g[uu])
{
if(visited[k.F])continue;
int v = k.F;
if(isbridge[k.S])
{
block[v] = ++blockno;
// cout<<" connect block "<<block[u]<<" and block "<<block[v]<<endl;
tree[block[u]].pb(block[v]);
tree[block[v]].pb(block[u]);
dfs2(v,u);
}
else
{
visited[v] = 1;
block[v] = block[u];
q[block[u]].push(v);
}
}
}
}
void dfstree(int u,int p)
{
FOR(i,1,LN)dp[u][i] = dp[dp[u][i-1]][i-1];
start[u] = t++;
for(auto v:tree[u])
{
if(v==p)continue;
dp[v][0] = u;
lvl[v] = lvl[u] + 1;
dfs3(v,u);
}
finish[u] = t++;
}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>blockcut-tree</tabTrigger>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<!-- <scope>source.python</scope> -->
</snippet>