• Router Mesh


    https://ac.nowcoder.com/acm/problem/211810

    小米邀请赛第一场D题

    #include<bits/stdc++.h>
    #define LL long long
    #define DB double
    #define IL inline
    #define p(a) putchar(a)
    #define For(i,a,b) for(int i=a;i<=b;++i)
    #define pb push_back
    using namespace std;
    
    const int N=5e5+3;
    
    int n,m,Q,tot,RT,top,cnt,num,Time,war_ans,dfn[N],low[N],sta[N],cut[N],mtx[N],du[N];
    int vis[N],bel[N],pos[N],dep[N],head[N],lonely[N];
    vector<int> vec[N];
    struct edge{int x,y;}a[N];
    struct EDGE{int next,to;}e[N<<1];
    
    IL int gi() {
        int x=0,p=1; char ch=getchar();
        while(ch<'0'||ch>'9') {if(ch=='-') p=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
        return x*p;
    }
    void o(int x){
        if(x<0){p('-');x=-x;}
        if(x>9)o(x/10);
        p(x%10+'0');
    }
    struct node{
        int x;
        int y;
    }s[N];
    IL void New() {
        tot=0;
        memset(&e,0,sizeof(e));
        memset(head,0,sizeof(head));
        memset(vis,0,sizeof(vis));
    }
    
    IL void make(int x,int y) {
        e[++tot]=(EDGE){head[x],y},head[x]=tot;
        e[++tot]=(EDGE){head[y],x},head[y]=tot;
    }
    
    void tarjan(int x) {
        int i,k,y,num=0;
        dfn[x]=low[x]=++Time,sta[++top]=x;
        if(x==RT&&head[x]==0) {
            vec[++cnt].push_back(x);
            lonely[x]=1;
            return;
        }
        for(i=head[x];i;i=e[i].next)
            if(!dfn[y=e[i].to]) {
                tarjan(y),low[x]=min(low[x],low[y]);
                if(dfn[x]<=low[y]) {
                    if(x!=RT||++num>1) cut[x]=1;
                    vec[++cnt].push_back(x);
                    do{
                        k=sta[top--]; 
                        vec[cnt].push_back(k);
                    }while(k!=y);
                }
            }
            else low[x]=min(low[x],dfn[y]);
    }
    
    signed main(){
        scanf("%d%d",&n,&m);
        int i,j,x,y;
        for(i=1;i<=m;++i)
            scanf("%d%d",&s[i].x,&s[i].y),make(s[i].x,s[i].y);
        for(i=1;i<=n;++i)
            if(!dfn[i]) RT=i,tarjan(i),war_ans++;
        for(i=1;i<=n;++i)
            if(cut[i]) bel[i]=++cnt,mtx[cnt]=1;
        for(i=1,New();i<=cnt;++i)
            for(j=0;j<vec[i].size();++j)
                if(cut[x=vec[i][j]]) make(i,bel[x]),du[x]++;
                else bel[x]=i;
        For(i,1,n){
            o(war_ans+du[i]-cut[i]-lonely[i]);p(' ');
        }
        return 0;
    }
  • 相关阅读:
    HtmlEncode 和 HtmlDecode
    Visual Studio .Net 的一些小技巧(2)
    Array和ArrayList的区别
    c#中 ?? 是什么意思?
    带有图片预览功能的上传表单 上传预览
    Js实现Repeater全选/反选 功能 终极解决方案
    处理URL重写后postback重写失效的问题 .browser文件
    在TreeView中使用CheckBox(c#)
    SQL操作全集
    智能仓库管理系统方案(一)
  • 原文地址:https://www.cnblogs.com/war1111/p/14045038.html
Copyright © 2020-2023  润新知