2020ICPC·小米 网络选拔赛第一场 D

D-Router Mesh
代码一写就会,再写就忘了
这题一看,跟我最近学的求割点好像,考虑一堆,删除单独成块的点块总数-1,删除块里的点分俩,非割点总块不增减,割点删后块数+1(后来WA了一发后想到删割点增加块数可能比1多,然后就不知道怎么操作了)
链式前向星建图,背模板吧,习惯到0结束(边数组开俩倍大)
ans[i]表示删去i点后增加多少块,在求割点算法标记为1的基础上修改
如果该点不是根节点的话,ans为1
望有不抄模板的能力吧

struct team {
    int to,next;
}edge[6*N];
int head[3*N],cnt,dfn[3*N],low[3*N],num,ans[3*N],now;
void addedge(int u,int v) {
    edge[++cnt].to=v;
    edge[cnt].next=head[u];
    head[u]=cnt;
}
void tarjin(int u) {
    dfn[u]=low[u]=++num;
    ans[u]=(u!=now);
    for(int i=head[u];i;i=edge[i].next) {
        int v=edge[i].to;
        if(!dfn[v]) {
            tarjin(v);
            low[u]=min(low[u],low[v]);
            ans[u]+=( low[v]>=dfn[u] );
        }
        else low[u]=min(low[u],dfn[v]);
    }
}
int main() {
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int n,m;cin>>n>>m;
    num=cnt=0;
    for(int i=1;i<=m;i++) {
        int u,v;cin>>u>>v;
        addedge(u,v);
        addedge(v,u);
    }
    int res=0;
    for(int i=1;i<=n;i++) {
        if(!dfn[i]) {
            now=i;
            tarjin(i);
            res++;
        }
    }
    for(int i=1;i<=n;i++) {
        cout<<res+ans[i]-1<<(i==n?"\n":" ");
    }

    return 0;
}
/*

*/

fighting

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页