割点和割边
struct node
{
int y,pre;
};
node a[N];
int pre[N],sign[N];
int dfn[N],low[N];
int tot,lenn;
int n,m,len;
void init()
{
memset(pre,-1,sizeof(pre));
memset(sign,false,sizeof(sign));
len=1;tot=1;
}
void addpage(int s,int t)
{
a[len].y=t;
a[len].pre=pre[s];
pre[s]=len++;
}
void dfs(int x,int s)
{
dfn[x]=low[x]=tot++;
sign[x]=true;
for(int i=pre[x]; i!=-1; i=a[i].pre)
{
int y=a[i].y;
if(y==s) continue;
if(!sign[y])
{
dfs(y,x);
low[x]=min(low[x],low[y]);
}
else low[x]=min(low[x],low[y]);
}
}
int main()
{
init();
repf(i,1,n)
if(!sign[i])
dfs(i,-1);
return 0;
}
对于边x~y,如果low[x]>dfn[y]||low[y]>dfn[x]即为割边
对于点u是图的割点当切仅当u存在一个字节点v.使得low[v]>=dfn[u]
割点割边 模板
最新推荐文章于 2024-08-27 16:20:43 发布