给自己的小练习19-[kuangbin带你飞]专题九连通图

没有写题解。补一波

Network of Schools

问题1:求有向图中入度为0的点个数

问题2:使得整个图变成一个联通分量

问题1直接缩点统计

问题2=max(入度为0的点,出度为0的点),注意原始图是一个联通分量的情况

Network

统计割点的个数。

割点的两种情况

Critical Links

统计有向图桥的数量

有向图桥在树枝边是判断一下

Network

往无向图的边中增加边,同时输出此时桥的数量

缩点后,进行暴力的并查集

void link(int x,int y)
{
    int fa1=find(x),fa2=find(y);
    if (dfn[fa1]<dfn[fa2]) fa[fa2]=fa1;
    else fa[fa1]=fa2;
}

while (p--) {
            scanf("%d %d",&j,&k);
            j=find(j);
            k=find(k);
            while (j!=k) {
                ans--;
                if (dfn[j]<dfn[k]) {
                    link(k,pre[k]);
                    k=find(k);
                }
                else {
                    link(j,pre[j]);
                    j=find(j);
                }
            }
            printf("%d
",ans);
        }
}

Warm up

缩点后求图的最长边

HDU - 4635  Strongly connected

添加尽可能多的边使得图不强联通

反向考虑,先让图强连通,再删边,算了下是个二次函数,也就是尽量把图分成大小差距很大的两块。

转化为找入度为0的最小联通块和出度为0的最小联通块。

HDU - 4685 

二分图匹配的可行边(不影响答案)

匹配后,一边的点连向他的match[],然后跑tarjan,如果在一个联通分量说明可以随便换,

那就判断与它相连的另一个点是否在同一个联通分量里面。

当然还有增加虚点的操作

HDU - 4738 

找无向图桥边,依然判断桥边只需在树枝边时判断

原文地址:https://www.cnblogs.com/Macaulish/p/7689179.html