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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值