RT,https://darkbzoj.tk/problem/3331
代码
#include<bits/stdc++.h>
#define re register
#define N 201001
#define MAX 2001
#define inf 1e18
#define eps 1e-10
using namespace std;
typedef long long ll;
typedef double db;
inline void read(re ll &ret)
{
ret=0;re bool pd=false;re char c=getchar();
while(!isdigit(c)){pd|=c=='-';c=getchar();}
while(isdigit(c)){ret=(ret<<1)+(ret<<3)+(c&15);c=getchar();}
ret=pd?-ret:ret;
return;
}
ll n,m,q,x,y,dfn[N],low[N],cnt,tot,sum[N],son[N],siz[N],top[N],f[N],dep[N],val[N];
vector<ll>v[N],g[N];
stack<ll>s;
bool cut[N];
inline void tarjan(re ll ver)
{
dfn[ver]=low[ver]=++cnt;
s.push(ver);
for(re unsigned i=0;i<v[ver].size();i++)
{
re ll to=v[ver][i];
if(!dfn[to])
{
tarjan(to);
low[ver]=min(low[ver],low[to]);
if(low[to]>=dfn[ver])
{
cut[ver]=true;
tot++;
while(s.top()!=ver)
{
g[tot].push_back(s.top());
g[s.top()].push_back(tot);
s.pop();
}
g[tot].push_back(s.top());
g[s.top()].push_back(tot);
}
}
else
low[ver]=min(low[ver],dfn[to]);
}
return;
}
inline void dfs1(re ll ver,re ll fa)
{
siz[ver]=1;
dep[ver]=dep[fa]+1;
for(re unsigned i=0;i<g[ver].size();i++)
{
re ll to=g[ver][i];
if(to==fa)
continue;
dfs1(to,ver);
siz[ver]+=siz[to];
if(siz[to]>siz[son[ver]])
son[ver]=to;
}
return;
}
inline void dfs2(re ll ver,re ll fa,re ll tp)
{
top[ver]=tp;
f[ver]=fa;
if(son[ver])
dfs2(son[ver],ver,tp);
for(re unsigned i=0;i<g[ver].size();i++)
{
re ll to=g[ver][i];
if(to==fa||to==son[ver])
continue;
dfs2(to,ver,to);
}
return;
}
inline ll lca(re ll p,re ll q)
{
while(top[p]^top[q])
{
if(dep[top[p]]<dep[top[q]])
swap(p,q);
p=f[top[p]];
}
if(dep[p]>dep[q])
swap(p,q);
return p;
}
inline void dfs3(re ll ver,re ll fa)
{
for(re unsigned i=0;i<g[ver].size();i++)
{
re ll to=g[ver][i];
if(to==fa)
continue;
dfs3(to,ver);
val[ver]+=val[to];
}
return;
}
signed main()
{
read(n);
read(m);
read(q);
for(re int i=1;i<=m;i++)
{
read(x);
read(y);
v[x].push_back(y);
v[y].push_back(x);
}
tot=n;
tarjan(1);
dfs1(1,0);
dfs2(1,0,1);
for(re int i=1;i<=q;i++)
{
read(x);
read(y);
re ll tmp=lca(x,y);
val[f[tmp]]--;
val[tmp]--;
val[x]++;
val[y]++;
}
dfs3(1,0);
for(re int i=1;i<=n;i++)
printf("%lld\n",val[i]);
exit(0);
}