[HDU2460]Network

Network

题目大意

给你一个无向连通图,再给出一些添边操作,询问每次添边操作之后图中还剩下多少桥。

Solution

其实很水,缩个点,然后此时图是一棵树,其中每条边都是割边,然后每次加边就把左右端点路径上的所有边都变成非割边即可

树剖维护一下。放这个题的原因就是码量大了一点。

upd:有一个码量很小的生成树的做法。。。我哭了

code:

#include<bits/stdc++.h>
using namespace std;
struct qwq{
    int v;
    int nxt;
}edge[400010];
int cnt=-1;
int head[200010];
void add(int u,int v){
    edge[++cnt].nxt=head[u];
    edge[cnt].v=v;
    head[u]=cnt;
}
struct tarj{
    int ind;
    int dfn[200010];
    int low[200010];
    int col[200010];
    bool vis[200010];
    int stk[200010];
    int top;
    int tot;
    int x[200010],y[200010];
    void init(){
        ind=0;
        tot=0;
        top=0;
        memset(low,0,sizeof(low));
        memset(dfn,0,sizeof(dfn));
        memset(col,0,sizeof(col));
        memset(vis,0,sizeof(vis));
    }
    void tarjan(int u,int fa){
        dfn[u]=low[u]=++ind;
        stk[++top]=u;
        vis[u]=true;
        for(int i=head[u];~i;i=edge[i].nxt){
            int v=edge[i].v;
            if(v==fa)continue;
            if(vis[v]){
                low[u]=min(low[u],dfn[v]);
            }
            else if(!dfn[v]){
                tarjan(v,u);
                low[u]=min(low[u],low[v]);
            }
        }
        if(dfn[u]==low[u]){
            tot++;
            int v;
            do{
                v=stk[top];
                top--;
                col[v]=tot;
            }while(u!=v);
        }
    }
}a;
int siz[200010];
int top[200010];
int son[200010];
int fa[200010];
int tid[200010];
int dep[200010];
void dfs1(int u,int fath,int depth){
    fa[u]=fath;
    dep[u]=depth;
    siz[u]=1;
    for(int i=head[u];~i;i=edge[i].nxt){
        int v=edge[i].v;
        if(v==fath)continue;
        dfs1(v,u,depth+1);
        siz[u]+=siz[v];
        if(!son[u]||siz[v]>siz[son[u]])son[u]=v;
    }
}
int tim;
void dfs2(int u,int topf){
    top[u]=topf;
    tid[u]=++tim;
    if(son[u])dfs2(son[u],topf);
    for(int i=head[u];~i;i=edge[i].nxt){
        int v=edge[i].v;
        if(v==fa[u]||v==son[u])continue;
        dfs2(v,v);
    }
}
int sum[400010];
int tag[400010];
void build(int o,int l,int r){
    tag[o]=0;
    if(l==r){
        sum[o]=1;
        return;
    }
    int mid=(l+r)/2;
    build(o*2,l,mid);
    build(o*2+1,mid+1,r);
    sum[o]=sum[o*2]+sum[o*2+1];
}
void pushdown(int o){
    if(tag[o]){
        sum[o*2]=sum[o*2+1]=0;
        tag[o*2]=tag[o*2+1]=1;
        tag[o]=0;
    }
}
void update(int o,int l,int r,int L,int R){
    if(L>R)return;
    if(L<=l&&r<=R){
        tag[o]=1,sum[o]=0;
        return;
    }
    pushdown(o);
    int mid=(l+r)/2;
    if(L<=mid)update(o*2,l,mid,L,R);
    if(mid<R)update(o*2+1,mid+1,r,L,R);
    sum[o]=sum[o*2]+sum[o*2+1];
}
int query(int o,int l,int r,int L,int R){
    if(L>R)return 0;
    if(L<=l&&r<=R){
        return sum[o];
    }
    pushdown(o);
    int mid=(l+r)/2;
    int ret=0;
    if(L<=mid)ret+=query(o*2,l,mid,L,R);
    if(mid<R)ret+query(o*2+1,mid+1,r,L,R);
    return ret;
}
void updatetree(int x,int y){
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        update(1,1,a.tot,tid[top[x]],tid[x]);
        x=fa[top[x]];
    }
    if(dep[x]>dep[y])swap(x,y);
    update(1,1,a.tot,tid[x]+1,tid[y]);
}
int main(){
    memset(head,-1,sizeof(head));
    int n,m;
    int cas=0;
    while(scanf("%d%d",&n,&m)&&n&&m){
        printf("Case %d:\n",++cas);
        a.init();
        tim=0;
        memset(siz,0,sizeof(siz));
        memset(top,0,sizeof(top));
        memset(son,0,sizeof(son));
        memset(fa,0,sizeof(fa));
        memset(tid,0,sizeof(tid));
        memset(dep,0,sizeof(dep));
        memset(head,-1,sizeof(head));
        cnt=-1;
        for(int i=1;i<=m;++i){
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,v),add(v,u);
            a.x[i]=u,a.y[i]=v;
        }
        for(int i=1;i<=n;++i){
            if(!a.vis[i])a.tarjan(i,-1);
        }
        memset(head,-1,sizeof(head));
        cnt=-1;
        for(int i=1;i<=m;++i){
            if(a.col[a.x[i]]!=a.col[a.y[i]]){
                add(a.col[a.x[i]],a.col[a.y[i]]);
                add(a.col[a.y[i]],a.col[a.x[i]]);
            }
        }
        dfs1(1,0,1);
        dfs2(1,1);
        build(1,1,a.tot);
        int q;
        scanf("%d",&q);
        for(int i=1;i<=q;++i){
            int u,v;
            scanf("%d%d",&u,&v);
            updatetree(a.col[u],a.col[v]);
            printf("%d\n",sum[1]-1);
        }
        puts("");
    }
}

原文地址:https://www.cnblogs.com/youddjxd/p/11624542.html

时间: 2024-08-30 05:04:01

[HDU2460]Network的相关文章

[hdu2460]network(依次连边并询问图中割边数量) tarjan边双联通分量+lca

题意: 给定一个n个点m条边的无向图,q个操作,每个操作给(x,y)连边并询问此时图中的割边有多少条.(连上的边会一直存在) n<=1e5,m<=2*10^5,q<=1e3,多组数据. 题解: 用tarjan求边双连通分量并缩点,缩点后组成一棵树,记录此时割边共有sum条. 连接(x,y),设c[i]为缩点后i所在的新点(边双连通分量),则c[x]-->lca-->c[y]形成一个环,环上的所有边都不再是割边,走一遍并标记,如果遇到没标记过的就sum--. 1 #includ

hdu2460&amp;&amp;poj3694 缩点+lca变形

http://acm.hdu.edu.cn/showproblem.php?pid=2460 http://poj.org/problem?id=3694 Problem Description A network administrator manages a large network. The network consists of N computers and M links between pairs of computers. Any pair of computers are c

ubuntu开机出现waiting for network configuration

ubuntu启动时,出现waiting for network configuration,waiting up to 60 more seconds for network configuration等,进入桌面后网络图标也不见了 解决方法,首先在 /etc/network/interfaces 文件里面无关的都删去,留下lo这个 然后再到/etc/init/failsafe.conf文件里将sleep59改成5或10,sleep50意思是等待59秒

Linux 性能监控 : CPU 、Memory 、 IO 、Network

一.CPU 1.良好状态指标 CPU利用率:User Time <= 70%,System Time <= 35%,User Time + System Time <= 70% 上下文切换:与CPU利用率相关联,如果CPU利用率状态良好,大量的上下文切换也是可以接受的 可运行队列:每个处理器的可运行队列<=3个线程 2.监控工具 vmstat $ vmstat 1 procs -----------memory---------- ---swap-- -----io---- --s

深度学习方法(十):卷积神经网络结构变化——Maxout Networks,Network In Network,Global Average Pooling

技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 最近接下来几篇博文会回到神经网络结构的讨论上来,前面我在"深度学习方法(五):卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning"一文中介绍了经典的CNN网络结构模型,这些可以说已经是家喻户晓的网络结构,在那一文结尾,我提到"是时候动一动卷积计算的形式了",原因是很多工作证明了,在基本的CNN卷积计算模式之外,很多简

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method

最近在做一个网络音乐播放器时,由于出现qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method, 而不能播放网络歌曲. 上网搜了半天,都说要在电脑那里安装openssl,然后把C:\OpenSSL-Win64\bin下的libeay32.dll和ssleay32.dll拷贝到D:\Qt\Qt5.4.2\5.4\mingw491_32\bin, 然而并没什么卵用! 我的解决办法是: Qt的这个目

bzoj1834: [ZJOI2010]network 网络扩容

努力看了很久样例一直过不了...然后各种输出中间过程啊巴拉巴拉弄了1h,没办法了...然后突然想到啊原来的边可以用啊为什么不用...于是A了...感人肺腑 #include<cstdio> #include<cstring> #include<queue> #include<iostream> #include<algorithm> using namespace std; #define rep(i,n) for(int i=1;i<=n

linux 6.x network device not active

[[email protected] Desktop]# service networkrestart Shutting down interface eth0: Error: Device\'eth0\' (/org/freedesktop/NetworkManager/Devices/0)disconnecting failed: This device is not active [FAILED] Shutting down loopback interface: [ OK ] Bring

centos linux中怎么查看和修改计算机名/etc/sysconfig/network

centos linux中怎么查看和修改计算机名 查看计算机名:在终端输入hostname 修改的话 hostname +计算机名(重启后失效)要永久修改的话要修改配置文件/etc/sysconfig/network修改hostname=你要改的名字