• poj3694(Network)


    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    
    struct my{
           int v;
           int next;
    };
    
    const int maxn=200000+10;
    
    int adj[maxn],adj2[maxn],low[maxn],dfn[maxn],fa,fa2,c[maxn],dfsn,tot,d[maxn];
    int f[maxn][20],fat[maxn*4];
    bool inedge[maxn*4];
    queue<int>Q;
    my bian[maxn*4],bian2[maxn*4];
    
    void init(){
         fa=1;
         fa2=1;
         dfsn=0;
         tot=0;
         memset(adj,0,sizeof(adj));
         memset(adj2,0,sizeof(adj2));
         memset(bian,0,sizeof(bian));
         memset(bian2,0,sizeof(bian2));
         memset(dfn,0,sizeof(dfn));
         memset(f,0,sizeof(f));
         memset(low,0,sizeof(low));
         memset(c,0,sizeof(c));
         memset(d,0,sizeof(d));
         memset(inedge,0,sizeof(inedge));
         while(!Q.empty()) Q.pop();
    }
    
    void myinsert(int u,int v){
         bian[++fa].v=v;
         bian[fa].next=adj[u];
         adj[u]=fa;
    }
    
    void myinsert2(int u,int v){
         bian2[++fa2].v=v;
         bian2[fa2].next=adj2[u];
         adj2[u]=fa2;
    }
    
    void tarjan(int x,int in_edge){
         low[x]=dfn[x]=++dfsn;
         for (int i=adj[x];i;i=bian[i].next){
            int v=bian[i].v;
            if(!dfn[v]){
                tarjan(v,i);
                low[x]=min(low[x],low[v]);
                if(low[v]>dfn[x]){
                    inedge[i]=1;
                    inedge[i^1]=1;
                }
            }
            else if((in_edge^1)!=i) low[x]=min(low[x],dfn[v]);
         }
    }
    
    void dfs(int x){
         c[x]=tot;
         for (int i=adj[x];i;i=bian[i].next){
            int v=bian[i].v;
            if(c[v]||inedge[i]) continue;
            dfs(v);
         }
    }
    
    void bfs(){
         Q.push(1);
         d[1]=1;
         while(!Q.empty()){
            int u=Q.front();Q.pop();
            for (int i=adj2[u];i;i=bian2[i].next){
                int v=bian2[i].v;
                if(d[v]) continue;
                d[v]=d[u]+1;
                f[v][0]=u;
                for (int j=1;j<=17;j++) f[v][j]=f[f[v][j-1]][j-1];
                Q.push(v);
            }
         }
    }
    
    int lca(int x,int y){
        if(d[x]>d[y]) swap(x,y);
        for (int i=17;i>=0;i--){
            if(d[x]<=d[f[y][i]]) y=f[y][i];
        }
        if(x==y) return x;
        for (int i=17;i>=0;i--){
            if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
        }
        return f[x][0];
    }
    
    int getfa(int x){
        if(x==fat[x]) return x;
        return fat[x]=getfa(fat[x]);
    }
    
    int main(){
        //freopen("A.out","w",stdout);
        int n,m;
        int u,v;
        int T=0,t;
        while(scanf("%d%d",&n,&m)&&n){
                init();
            for (int i=1;i<=m;i++){
                scanf("%d%d",&u,&v);
                myinsert(u,v);
                myinsert(v,u);
            }
            for (int i=1;i<=n;i++){
                    if(!dfn[i])
                 tarjan(i,0);
            }
    
            for (int i=1;i<=n;i++){
                if(!c[i]){
                    tot++;
                    dfs(i);
                }
            }
            for (int i=2;i<=fa;i++){
                int x=bian[i].v;
                int y=bian[i^1].v;
                if(c[x]!=c[y])
                   myinsert2(c[x],c[y]);
            }
            bfs();
            int ans=tot-1;
            T++;
            printf("Case %d:
    ",T);
            scanf("%d",&t);
            for (int i=1;i<=tot;i++) fat[i]=i;
            while(t--){
                int x,y;
                scanf("%d%d",&u,&v);
                if(c[u]==c[v]) ;
                else {
                x=c[u];
                y=c[v];
                int p=lca(x,y);
                x=getfa(x);
                while(d[p]<d[x]){
                  fat[x]=f[x][0];
                  ans--;
                  x=getfa(x);
                  }
                y=getfa(y);
                while(d[p]<d[y]){
                   fat[y]=f[y][0];
                   ans--;
                   y=getfa(y);
                 }
                }
                printf("%d
    ",ans);
            }
            printf("
    ");
        }
    return 0;
    }
  • 相关阅读:
    CVS,GIT,Mercurial和SVN比较
    ubuntu-使用终端配置网络
    编写简单的hashCode方法
    编写高质量equals方法
    文件上传和下载
    Java常用命令
    增删查改-MySQL
    Newton迭代法-C++
    二分法-C++
    适配器模式
  • 原文地址:https://www.cnblogs.com/lmjer/p/9387774.html
Copyright © 2020-2023  润新知